public async Task TestAsync(DemoCard demoCard) { var ps = await demoCard.Body.QuerySelectorAllAsync("p"); await TestRadioList(ps[0], 0); await TestRadioList(ps[1], 2); }
public async Task TestAsync(DemoCard demoCard) { await AssertFillAsync(demoCard); await submitButton.ClickAsync(); await Task.Delay(500); var resultEl = await demoCard.Page.QuerySelectorAsync("div.el-message-box__wrapper > div > div.el-message-box__content > div.el-message-box__message > p"); var result = await resultEl.EvaluateFunctionAsync <string>("x=>x.innerText"); Assert.Equal($"名称:测试活动,区域:Bejing,区域2:Bejing,日期:{DateTime.Now.ToString("yyyy/M/1")} 0:00:00,即时配送:False,性质:Offline,特殊资源:场地,枚举资源:Option1,活动形式:测试活动", result); var okButton = await demoCard.Page.QuerySelectorAsync("div.el-message-box__wrapper > div > div.el-message-box__btns > button"); Assert.NotNull(okButton); await okButton.ClickAsync(); await Task.Delay(500); okButton = await demoCard.Page.QuerySelectorAsync("div.el-message-box__wrapper > div > div.el-message-box__btns > button"); Assert.Null(okButton); await resetButton.ClickAsync(); await Task.Delay(50); await AssertFormAsync(demoCard, false, new List <int>()); }
private static async Task AssertEmptyBody(DemoCard card) { var body = await card.Body.QuerySelectorAsync("div.el-tabs.el-tabs--card.el-tabs--top > div.el-tabs__content"); var bodyContent = await body.EvaluateFunctionAsync <string>("x=>x.innerText"); Assert.True(string.IsNullOrWhiteSpace(bodyContent)); }
private async Task AssertBodyAsync(DemoCard card, string text) { var bodyEl = await card.Body.QuerySelectorAsync("div.el-tabs > div.el-tabs__content"); Assert.NotNull(bodyEl); var bodyText = await bodyEl.EvaluateFunctionAsync <string>("x=>x.innerText"); Assert.Equal(text, bodyText?.Trim()); }
public async Task TestAsync(DemoCard demoCard) { var checkAll = await demoCard.Body.QuerySelectorAsync("label.el-checkbox"); var checkboxes = await demoCard.Body.QuerySelectorAllAsync("div.el-checkbox-group > label.el-checkbox"); var checkedIndexes = new List <int>(); checkedIndexes.Add(0); checkedIndexes.Add(2); await AssertCheckBoxesAsync(checkboxes, checkedIndexes.ToArray()); var count = 20; var random = new Random(); while (count-- > 0) { var index = random.Next(3); await checkboxes[index].ClickAsync(); await Task.Delay(50); if (checkedIndexes.Contains(index)) { checkedIndexes.Remove(index); } else { checkedIndexes.Add(index); } if (checkedIndexes.Count == 3) { await AssertCheckBoxAsync(true, checkAll); } else if (checkedIndexes.Count == 0) { await AssertCheckBoxAsync(false, checkAll); } await AssertCheckBoxesAsync(checkboxes, checkedIndexes.ToArray()); } await checkAll.ClickAsync(); await Task.Delay(50); checkedIndexes.Clear(); checkedIndexes.Add(0); checkedIndexes.Add(1); checkedIndexes.Add(2); await AssertCheckBoxesAsync(checkboxes, checkedIndexes.ToArray()); await checkAll.ClickAsync(); await Task.Delay(50); checkedIndexes.Clear(); await AssertCheckBoxesAsync(checkboxes, checkedIndexes.ToArray()); }
async Task <List <(string Title, ElementHandle Header)> > GetHeadersAsync(DemoCard card) { var header = await card.Body.QuerySelectorAsync("div.el-tabs.el-tabs--card.el-tabs--top > div.el-tabs__header.is-top"); Assert.NotNull(header); var tabHeaders = await header.QuerySelectorAllAsync("div.el-tabs__nav-wrap.is-top > div.el-tabs__nav-scroll > div.el-tabs__nav.is-top > div.el-tabs__item.is-top.is-closable"); var tasks = tabHeaders.Select(async x => ((await x.EvaluateFunctionAsync <string>("m=>m.innerText")).Trim(), x)); List <(string Title, ElementHandle Header)> headers = (await Task.WhenAll(tasks)).ToList(); return(headers); }
private async Task AssertCloseMessageBoxAsync(DemoCard demoCard) { var okButton = await demoCard.Page.QuerySelectorAsync("div.el-message-box__wrapper > div > div.el-message-box__btns > button"); Assert.NotNull(okButton); await okButton.ClickAsync(); await Task.Delay(500); okButton = await demoCard.Page.QuerySelectorAsync("div.el-message-box__wrapper > div > div.el-message-box__btns > button"); Assert.Null(okButton); }
public async Task TestAsync(DemoCard card) { var header = await card.Body.QuerySelectorAsync("div.el-tabs.el-tabs--top > div.el-tabs__header.is-top"); var body = await card.Body.QuerySelectorAsync("div.el-tabs.el-tabs--top > div.el-tabs__content"); Assert.NotNull(header); Assert.NotNull(body); var navElement = await header.QuerySelectorAsync("div.el-tabs__nav-wrap > div.el-tabs__nav-scroll > div.el-tabs__nav"); Assert.NotNull(navElement); var tabHeaders = await header.QuerySelectorAllAsync("div.el-tabs__nav-wrap.is-top > div.el-tabs__nav-scroll > div.el-tabs__nav.is-top > div.el-tabs__item.is-top"); var tasks = tabHeaders.Select(async x => new { Title = await x.EvaluateFunctionAsync <string>("m=>m.innerText"), Header = x }); var headers = (await Task.WhenAll(tasks)).ToList(); Assert.Equal(4, headers.Count); Assert.Equal("用户管理", headers[0].Title); Assert.Equal("角色管理", headers[1].Title); Assert.Equal("部门管理", headers[2].Title); Assert.Equal("人员管理", headers[3].Title); await AssertHeaderAsync(navElement, tabHeaders, 0); await AssertBodyAsync(body, "用户管理1"); await AssertHoverAsync(tabHeaders[0]); foreach (var tabHeader in headers.Skip(1)) { await tabHeader.Header.ClickAsync(); await Task.Delay(100); var index = headers.IndexOf(tabHeader); await AssertHoverAsync(tabHeader.Header); await AssertHeaderAsync(navElement, tabHeaders, index); await AssertBodyAsync(body, $"{tabHeader.Title}1"); } }
public async Task TestAsync(DemoCard demoCard) { var checkboxes = await demoCard.Body.QuerySelectorAllAsync("label.el-checkbox"); var checkedIndexes = new List <int>(); var disabledIndexes = new List <int>(); disabledIndexes.Add(1); await AssertCheckBoxesAsync(checkboxes, checkedIndexes.ToArray(), disabledIndexes.ToArray()); await checkboxes[0].ClickAsync(); await Task.Delay(50); checkedIndexes.Add(0); await AssertCheckBoxesAsync(checkboxes, checkedIndexes.ToArray(), disabledIndexes.ToArray()); await checkboxes[1].ClickAsync(); await Task.Delay(50); await AssertCheckBoxesAsync(checkboxes, checkedIndexes.ToArray(), disabledIndexes.ToArray()); }
async Task <List <(string Title, ElementHandle Header)> > AssertTabAsync(DemoCard card, List <string> tabs, int activeIndex) { var body = await card.Body.QuerySelectorAsync("div.el-tabs.el-tabs--card.el-tabs--top > div.el-tabs__content"); Assert.NotNull(body); var headers = await GetHeadersAsync(card); var tabHeaders = headers.Select(x => x.Header).ToArray(); Assert.Equal(tabs.Count, headers.Count); for (int i = 0; i < tabs.Count; i++) { Assert.Equal(tabs[i], headers[i].Title); } if (!tabs.Any()) { return(headers); } await AssertHeaderAsync(tabHeaders, activeIndex); await AssertBodyAsync(body, tabs[activeIndex]); await AssertHoverAsync(tabHeaders, activeIndex); foreach (var tabHeader in headers) { await tabHeader.Header.ClickAsync(); await Task.Delay(100); var index = headers.IndexOf(tabHeader); await AssertHoverAsync(tabHeaders, index); await AssertHeaderAsync(tabHeaders, index); await AssertBodyAsync(body, tabHeader.Title); } return(headers); }
public async Task TestAsync(DemoCard demoCard) { await TestRadioList(await demoCard.Body.QuerySelectorAsync("div.el-radio-group"), 1); }
public async Task TestAsync(DemoCard card) { var tabs = new List <string>(); tabs.Add("选项卡1"); tabs.Add("卡2"); tabs.Add("卡3"); tabs.Add("Component"); var originTabs = tabs.ToList(); var headers = await AssertTabAsync(card, tabs, 0); await headers[0].Header.ClickAsync(); await Task.Delay(200); while (true) { var headerItem = headers.FirstOrDefault(); if (headerItem.Header == null) { break; } await headerItem.Header.ClickAsync(); await Task.Delay(200); var closeIcon = await headerItem.Header.QuerySelectorAsync("span.el-icon-close"); Assert.NotNull(closeIcon); await closeIcon.ClickAsync(); await Task.Delay(200); tabs.RemoveAt(0); headers = await AssertTabAsync(card, tabs, 0); } await AssertEmptyBody(card); await card.Page.ReloadAsync(); Page = card.Page; var cards = await WaitForDemoCardsAsync(); card = cards.FirstOrDefault(x => x.Title == card.Title); headers = await GetHeadersAsync(card); await headers[3].Header.ClickAsync(); await Task.Delay(200); tabs = originTabs.ToList(); while (true) { var headerItem = headers.LastOrDefault(); if (headerItem.Header == null) { break; } await headerItem.Header.ClickAsync(); await Task.Delay(200); var closeIcon = await headerItem.Header.QuerySelectorAsync("span.el-icon-close"); Assert.NotNull(closeIcon); await closeIcon.ClickAsync(); await Task.Delay(200); tabs.RemoveAt(tabs.Count - 1); headers = await AssertTabAsync(card, tabs, tabs.Count - 1); } await AssertEmptyBody(card); var newTab = await card.Body.QuerySelectorAsync("div.el-tabs.el-tabs--card.el-tabs--top > div.el-tabs__header.is-top > span.el-tabs__new-tab"); Assert.NotNull(newTab); tabs.Add("标题0"); tabs.Add("标题1"); tabs.Add("标题2"); tabs.Add("标题3"); for (int i = 0; i < 4; i++) { await newTab.ClickAsync(); await Task.Delay(200); } headers = await GetHeadersAsync(card); originTabs = tabs.ToList(); while (true) { var headerItem = headers.LastOrDefault(); if (headerItem.Header == null) { break; } await headerItem.Header.ClickAsync(); await Task.Delay(200); var closeIcon = await headerItem.Header.QuerySelectorAsync("span.el-icon-close"); Assert.NotNull(closeIcon); await closeIcon.ClickAsync(); await Task.Delay(200); tabs.RemoveAt(tabs.Count - 1); headers = await AssertTabAsync(card, tabs, tabs.Count - 1); } }
private async Task AssertFillAsync(DemoCard demoCard) { var filledIndexes = new List <int>(); await AssertFormAsync(demoCard, false, filledIndexes); await submitButton.ClickAsync(); await Task.Delay(50); await AssertFormAsync(demoCard, true, filledIndexes); var formItem1 = formItems.FirstOrDefault(); var formItem1Input = await formItem1.QuerySelectorAsync("div.el-input > input"); var label1 = await formItem1.QuerySelectorAsync("label"); await formItem1Input.TypeAsync("测试活动"); await label1.ClickAsync(); await Task.Delay(50); var text1 = await formItem1Input.EvaluateFunctionAsync <string>("x=>x.value"); Assert.Equal("测试活动", text1.Trim()); filledIndexes.Add(0); await AssertFormAsync(demoCard, true, filledIndexes); //跳过活动区域的测试 var formItem3 = formItems.Skip(2).FirstOrDefault(); var content3 = await formItem3.QuerySelectorAsync("div.el-form-item__content"); var selector = await content3.QuerySelectorAsync("div.el-select > div.el-input.el-input--suffix"); await selector.ClickAsync(); await Task.Delay(500); var firstItem = await demoCard.Page.QuerySelectorAsync("div.el-select-dropdown.el-popper > div.el-scrollbar > div.el-select-dropdown__wrap.el-scrollbar__wrap > ul.el-scrollbar__view.el-select-dropdown__list > li.el-select-dropdown__item"); await firstItem.ClickAsync(); await Task.Delay(500); var itemText = await firstItem.EvaluateFunctionAsync <string>("x=>x.innerText"); var input = await content3.QuerySelectorAsync("div.el-select > div.el-input.el-input--suffix > input[type='text'][placeholder='请选择活动区域'].el-input__inner"); var selectedItemText = await input.EvaluateFunctionAsync <string>("x=>x.value"); Assert.Equal(itemText?.Trim(), selectedItemText?.Trim()); firstItem = await demoCard.Page.QuerySelectorAsync("div.el-select-dropdown.el-popper > div.el-scrollbar > div.el-select-dropdown__wrap.el-scrollbar__wrap > ul.el-scrollbar__view.el-select-dropdown__list > li.el-select-dropdown__item"); Assert.Null(firstItem); filledIndexes.Add(2); await AssertFormAsync(demoCard, true, filledIndexes); //活动时间 var formItem4 = formItems.Skip(3).FirstOrDefault(); var content4 = await formItem4.QuerySelectorAsync("div.el-form-item__content"); var selector4 = await content4.QuerySelectorAsync("div.el-input.el-date-editor.el-input--prefix.el-input--suffix.el-date-editor--date"); await selector4.ClickAsync(); await Task.Delay(500); var firstItem4 = await demoCard.Page.QuerySelectorAsync("div.el-picker-panel.el-date-picker.el-popper > div.el-picker-panel__body-wrapper > div.el-picker-panel__body > div.el-picker-panel__content > table > tbody > tr.el-date-table__row > td.available > div > span"); await firstItem4.ClickAsync(); var day = await firstItem4.EvaluateFunctionAsync <string>("x=>x.innerText"); expectedDate = DateTime.Now.ToString($"yyyy-MM-{day.PadLeft(2, '0')}"); await Task.Delay(500); var input4 = await content4.QuerySelectorAsync("div.el-input.el-date-editor.el-input--prefix.el-input--suffix.el-date-editor--date > input[type='text'][placeholder='请选择日期'][name='Time'].el-input__inner"); var selectedItemText4 = await input4.EvaluateFunctionAsync <string>("x=>x.value"); Assert.Equal(expectedDate, selectedItemText4); firstItem4 = await demoCard.Page.QuerySelectorAsync("div.el-picker-panel.el-date-picker.el-popper > div.el-picker-panel__body-wrapper > div.el-picker-panel__body > div.el-picker-panel__content > table > tbody > tr.el-date-table__row > td.available > div > span"); Assert.Null(firstItem); filledIndexes.Add(3); await AssertFormAsync(demoCard, true, filledIndexes); //即时配送 //活动性质 var formItem6 = formItems.Skip(5).FirstOrDefault(); var content6 = await formItem6.QuerySelectorAsync("div.el-form-item__content"); var checkbox6 = (await content6.QuerySelectorAllAsync("div.el-checkbox-group > label.el-checkbox > span.el-checkbox__label"))[1]; await checkbox6.ClickAsync(); await Task.Delay(50); var checkedCheckbox6 = (await content6.QuerySelectorAsync("div.el-checkbox-group > label.el-checkbox.is-checked > span.el-checkbox__label")); var checkboxLabel = await checkbox6.EvaluateFunctionAsync <string>("x=>x.innerText"); var checkedCheckboxLabel = await checkedCheckbox6.EvaluateFunctionAsync <string>("x=>x.innerText"); Assert.Equal("地推活动", checkboxLabel.Trim()); Assert.Equal("地推活动", checkedCheckboxLabel.Trim()); filledIndexes.Add(5); await AssertFormAsync(demoCard, true, filledIndexes); //特殊资源 var formItem7 = formItems.Skip(6).FirstOrDefault(); var content7 = await formItem7.QuerySelectorAsync("div.el-form-item__content"); var radio7 = (await content7.QuerySelectorAllAsync("label.el-radio.el-radio-button--default > span.el-radio__label"))[1]; await radio7.ClickAsync(); await Task.Delay(50); var checkedRadio7 = (await content7.QuerySelectorAsync("label.el-radio.is-checked.el-radio-button--default > span.el-radio__label")); var radioLabel7 = await radio7.EvaluateFunctionAsync <string>("x=>x.innerText"); var checkedRadioLabel7 = await checkedRadio7.EvaluateFunctionAsync <string>("x=>x.innerText"); Assert.Equal("线上场地免费", radioLabel7.Trim()); Assert.Equal("线上场地免费", checkedRadioLabel7.Trim()); filledIndexes.Add(6); await AssertFormAsync(demoCard, true, filledIndexes); //活动形式 var formItem8 = formItems.Skip(7).FirstOrDefault(); var formItem8Input = await formItem8.QuerySelectorAsync("div.el-input > input"); var label8 = await formItem1.QuerySelectorAsync("label"); await formItem8Input.TypeAsync("测试活动"); await label8.ClickAsync(); await Task.Delay(50); var text8 = await formItem8Input.EvaluateFunctionAsync <string>("x=>x.value"); Assert.Equal("测试活动", text8.Trim()); filledIndexes.Add(7); await AssertFormAsync(demoCard, true, filledIndexes); }
private async Task AssertFormAsync(DemoCard demoCard, bool showRequired, List <int> filledIndexes) { var form = await demoCard.Body.QuerySelectorAsync("form.el-form--label-left.el-form"); Assert.NotNull(form); formItems = await form.QuerySelectorAllAsync("div.el-form-item"); Assert.Equal(9, formItems.Length); foreach (var formItem in formItems) { var index = Array.IndexOf(formItems, formItem); var label = await formItem.QuerySelectorAsync("label[for='name'].el-form-item__label"); var content = await formItem.QuerySelectorAsync("div.el-form-item__content"); Assert.NotNull(content); var contentMarginLeft = await content.EvaluateFunctionAsync <string>("x=>x.style.marginLeft"); var classList = await formItem.EvaluateFunctionAsync <string>("x=>x.classList.toString()"); var clsList = classList.Split(' ').Select(x => x.Trim()).ToArray() ?? new string[0]; string labelWidth = string.Empty; string labelText = string.Empty; var error = await content.QuerySelectorAsync("div.el-form-item__error"); if (index < 8) { Assert.NotNull(label); labelWidth = await label.EvaluateFunctionAsync <string>("x=>x.style.width"); labelText = await label.EvaluateFunctionAsync <string>("x=>x.innerText"); Assert.Equal("100px", contentMarginLeft); Assert.Equal("100px", labelWidth); if (index == 2) { Assert.DoesNotContain("is-required", clsList); } else { Assert.Contains("is-required", clsList); } } else { Assert.Null(label); Assert.True(string.IsNullOrWhiteSpace(contentMarginLeft)); Assert.True(string.IsNullOrWhiteSpace(labelWidth)); Assert.DoesNotContain("is-required", clsList); } if (index == 0) { Assert.Equal("活动名称", labelText?.Trim()); var input = await content.QuerySelectorAsync("div.el-input > input[type='text'][name='Name'][placeholder='请输入内容'].el-input__inner"); Assert.NotNull(input); var inputValue = await input.EvaluateFunctionAsync <string>("x=>x.value"); if (filledIndexes.Contains(0)) { Assert.Null(error); Assert.Equal("测试活动", inputValue); } else { await AssertErrorAsync(showRequired, error, "请确认活动名称"); Assert.Equal(string.Empty, inputValue); } continue; } if (index == 1) { Assert.Equal("活动区域", labelText?.Trim()); var input = await content.QuerySelectorAsync("div.el-select > div.el-input.el-input--suffix > input[type='text'][placeholder='请选择活动区域'].el-input__inner"); Assert.NotNull(input); var inputValue = await input.EvaluateFunctionAsync <string>("x=>x.value"); Assert.Equal("北京", inputValue); var icon = await content.QuerySelectorAsync("div.el-select > div.el-input.el-input--suffix > span.el-input__suffix > span.el-input__suffix-inner > i.el-input__icon.el-select__caret.el-icon-arrow-up"); Assert.NotNull(icon); Assert.Null(error); continue; } if (index == 2) { Assert.Equal("活动区域2", labelText?.Trim()); var input = await content.QuerySelectorAsync("div.el-select > div.el-input.el-input--suffix > input[type='text'][placeholder='请选择活动区域'].el-input__inner"); var inputValue = await input.EvaluateFunctionAsync <string>("x=>x.value"); Assert.NotNull(input); var icon = await content.QuerySelectorAsync("div.el-select > div.el-input.el-input--suffix > span.el-input__suffix > span.el-input__suffix-inner > i.el-input__icon.el-select__caret.el-icon-arrow-up"); Assert.NotNull(icon); Assert.Null(error); if (filledIndexes.Contains(2)) { Assert.Equal("北京", inputValue); } else { Assert.Equal(string.Empty, inputValue); } continue; } if (index == 3) { Assert.Equal("活动时间", labelText?.Trim()); var input = await content.QuerySelectorAsync("div.el-input.el-date-editor.el-input--prefix.el-input--suffix.el-date-editor--date > input[type='text'][placeholder='请选择日期'][name='Time'].el-input__inner"); Assert.NotNull(input); var inputValue = await input.EvaluateFunctionAsync <string>("x=>x.value"); var icon = await content.QuerySelectorAsync("div.el-input.el-date-editor.el-input--prefix.el-input--suffix.el-date-editor--date > span.el-input__prefix > i.el-input__icon.el-icon-date"); Assert.NotNull(icon); if (filledIndexes.Contains(index)) { var selectedDay = await input.EvaluateFunctionAsync <string>("x=>x.value"); Assert.Equal(expectedDate, selectedDay); Assert.Null(error); } else { Assert.Equal(string.Empty, inputValue); await AssertErrorAsync(showRequired, error, "请确认活动时间"); } continue; } if (index == 4) { Assert.Equal("即时配送", labelText?.Trim()); var input = await content.QuerySelectorAsync("div.el-switch > input[type='checkbox'].el-switch__input"); Assert.NotNull(input); var icon = await content.QuerySelectorAsync("div.el-switch > span.el-switch__core"); Assert.NotNull(icon); var borderColor = await icon.EvaluateFunctionAsync <string>("x=>x.style.borderColor"); Assert.Equal("rgb(19, 206, 102)", borderColor); var backgroundColor = await icon.EvaluateFunctionAsync <string>("x=>x.style.backgroundColor"); Assert.Equal("rgb(192, 204, 218)", backgroundColor); Assert.Null(error); continue; } if (index == 5) { Assert.Equal("活动性质", labelText?.Trim()); var checkboxes = await content.QuerySelectorAllAsync("div.el-checkbox-group > label.el-checkbox"); Assert.Equal(2, checkboxes.Length); if (filledIndexes.Contains(index)) { Assert.Null(error); } else { await AssertErrorAsync(showRequired, error, "请确认活动性质"); } continue; } if (index == 6) { Assert.Equal("特殊资源", labelText?.Trim()); var radios = await content.QuerySelectorAllAsync("label.el-radio.el-radio-button--default"); Assert.Equal(2, radios.Length); if (filledIndexes.Contains(index)) { Assert.Null(error); } else { await AssertErrorAsync(showRequired, error, "请确认特殊资源"); } continue; } if (index == 7) { Assert.Equal("活动形式", labelText?.Trim()); var input = await content.QuerySelectorAsync("div.el-input > input[type='textarea'][name='Description'][placeholder='请输入内容'].el-input__inner"); Assert.NotNull(input); var inputValue = await input.EvaluateFunctionAsync <string>("x=>x.value"); if (filledIndexes.Contains(index)) { Assert.Equal("测试活动", inputValue); Assert.Null(error); } else { Assert.Equal(string.Empty, inputValue); await AssertErrorAsync(showRequired, error, "请确认活动形式"); } continue; } if (index == 8) { Assert.True(string.IsNullOrWhiteSpace(labelText)); submitButton = await content.QuerySelectorAsync("button.el-button.el-button--primary"); Assert.NotNull(submitButton); resetButton = await content.QuerySelectorAsync("button.el-button.el-button--default"); Assert.NotNull(resetButton); continue; } throw new Exception(index.ToString()); } }
public async Task TestAsync(DemoCard card) { var tabs = new List <string>(); tabs.Add("选项卡1"); tabs.Add("卡2"); tabs.Add("卡3"); tabs.Add("Component"); var originTabs = tabs.ToList(); await Task.Delay(200); var headers = await GetHeadersAsync(card); await headers[0].Header.ClickAsync(); await Task.Delay(200); ElementHandle closeIcon = null; while (true) { var headerItem = headers.FirstOrDefault(); if (headerItem.Header == null) { break; } await headerItem.Header.ClickAsync(); await Task.Delay(200); closeIcon = await headerItem.Header.QuerySelectorAsync("span.el-icon-close"); Assert.NotNull(closeIcon); await closeIcon.ClickAsync(); await Task.Delay(200); tabs.RemoveAt(0); headers = await GetHeadersAsync(card); } await AssertEmptyBody(card); var newTab = await card.Body.QuerySelectorAsync("button"); tabs.Add("标题0"); tabs.Add("标题1"); tabs.Add("标题2"); tabs.Add("标题3"); for (int i = 0; i < 4; i++) { await newTab.ClickAsync(); await Task.Delay(200); } headers = await GetHeadersAsync(card); while (true) { var headerItem = headers.LastOrDefault(); if (headerItem.Header == null) { break; } await headerItem.Header.ClickAsync(); await Task.Delay(200); closeIcon = await headerItem.Header.QuerySelectorAsync("span.el-icon-close"); Assert.NotNull(closeIcon); await closeIcon.ClickAsync(); await Task.Delay(200); tabs.RemoveAt(tabs.Count - 1); headers = await AssertTabAsync(card, tabs, tabs.Count - 1); } await AssertEmptyBody(card); var count = 5; await newTab.ClickAsync(); await Task.Delay(200); while (count-- > 0) { await newTab.ClickAsync(); await Task.Delay(200); headers = await GetHeadersAsync(card); Assert.Equal(2, headers.Count); tabs = headers.Select(x => x.Title).ToList(); var tabHeaders = headers.Select(x => x.Header).ToArray(); await headers[0].Header.ClickAsync(); await Task.Delay(200); await AssertHeaderAsync(tabHeaders, 0); closeIcon = await headers[0].Header.QuerySelectorAsync("span.el-icon-close"); await closeIcon.ClickAsync(); tabs.RemoveAt(0); await Task.Delay(200); headers = await GetHeadersAsync(card); Assert.Single(headers); var body = await card.Body.QuerySelectorAsync("div.el-tabs.el-tabs--card.el-tabs--top > div.el-tabs__content"); await AssertBodyAsync(body, headers[0].Title); } }