gpt4 book ai didi

c# - 从相关的下拉框中选择一个选项 Selenium 网络驱动程序

转载 作者:行者123 更新时间:2023-11-30 16:59:49 26 4
gpt4 key购买 nike

我的应用程序必须在 IE 中使用。我正在自动化测试,其中脚本首先必须在第一个下拉框“类别”中选择一个选项,以便在第二个下拉框“名称”中显示与类别相关的选项。然后脚本在“名称”中选择一个选项,然后将显示一个关联的页面。
在“类别”中进行选择之前,“名称”没有任何选项。 HTML 来源:

<select id="drop_Category">
<option value =""/>
<option value = "Category1">
Text - Category1
<option value = "Category2">
Text - Category2
<select id="drop_Name">

选择“Category1”选项后,HTML 源更改为:

<select id="drop_Category">
<option value =""/>
<option value = "Category1">
Text - Category1
<option value = "Category2">
Text - Category2
<select id="drop_Name">
<option value =""/>
<option value = "C1_Name1">
Text - C1_Name1
<option value = "C1_Name2">
Text - C1_Name2
<option value = "C1_Name3">
Text - C1_Name3

对于选择“Category1”和“C1_Name3”的脚本,我的第一版代码是:

//Select option in drop-box "Category"
stringText = "Category1";
var dropCategory = new SelectElement(driver.FindElement(By.Id("drop_Category")));
dropCategory.SelectByText(stringText);

//Select option in drop-box "Name"
stringText = "C1_Name3";
var dropName = new SelectElement(driver.FindElement(By.Id("drop_Name")));
dropName.SelectByText(stringText);

此代码不起作用,因为“名称”中的列表尚未加载且脚本无法找到带有文本“C1_Name3”的选项,因此我添加了隐式等待。等待没有帮助,所以我试图捕捉异常。这是代码的第二个版本:

//Select option in drop-box "Category"
stringText = "Category1";
var dropCategory = new SelectElement(driver.FindElement(By.Id("drop_Category")));
dropCategory.SelectByText(stringText);

//Select option in drop-box "Name"
stringText = "C1_Name3"
try
{
var dropName = new SelectElement(driver.FindElement(By.Id("drop_Name")));
dropName.SelectByText(stringText);
}
catch (NoSuchElementException)
{
var dropName = new SelectElement(driver.FindElement(By.Id("drop_Name")));
dropName.SelectByText(stringText);
}

它可以工作,但有时仍会因 InvalidSelectorException 或 StaleElementReferenceException 异常而崩溃。我不知道该怎么做才能始终如一地完成这项工作。另外,我是这个领域的新手,所以我不确定像我的第二个版本那样编写代码是否是一种不好的做法。非常感谢任何帮助。

最佳答案

初始方法

通常(根据我的经验)除了等待时间方法之外还需要 sleep 时间;所以尝试将两者结合起来。

例如,我会尝试循环直到找到您想要的元素。 伪代码如下:

boolean found = false;
while (!found) {
try
{
var dropName = new SelectElement(driver.FindElement(By.Id("drop_Name")));
dropName.SelectByText(stringText);
found = true;
}
catch (NoSuchElementException)
{
var dropName = new SelectElement(driver.FindElement(By.Id("drop_Name")));
dropName.SelectByText(stringText);
//do a short sleep here e.g. 500ms depending on the speed of your site
}

}

来自documentation on the InvalidSelectorException ,当“用于查找元素的选择器不返回 WebElement”时也会抛出该异常。所以捕获 NoSuchElementException 应该就足够了。

替代方法

  • 来自你的问题 <select id="drop_Name">从一开始就存在于代码中。
  • 因此driver.findElement总是通过 ID drop_Name 找到 WebElement
  • 区别在于直到您选择Category1 , drop_Name没有<option>值(value)观。
  • 因此你可以试试下面的等待函数:

(注意:代码是用 Java 编写的;可以轻松移植到 C#)

private static void waitUntilOptionsLoad() {
while(true) {
Thread.sleep(1000);
List<WebElement> options = driver.findElement(By.id("drop_Name"))
.findElements(By.tagName("option"));
if (options.size() > 0 ) {
System.out.println("More than one option tag found; therefore options have loaded");
break;
}
}

关于c# - 从相关的下拉框中选择一个选项 Selenium 网络驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23208714/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com