我的应用程序必须在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异常,有时仍会崩溃。我不知道该怎么做才能让这项工作始终如一。另外,我是该领域的新手,所以我不确定在第二版中编写代码是不是很糟糕。非常感谢任何帮助。
答案 0 :(得分:2)
初步方法
通常(根据我的经验)除了等待时间方法之外还需要休眠时间;所以尝试将两者结合起来。
例如,我会尝试循环,直到找到所需的元素。 伪代码如下:
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
Category1
,drop_Name
没有<option>
值。(注意:代码是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;
}
}