从依赖的下拉框Selenium Web驱动程序中选择一个选项

时间:2014-04-22 01:15:17

标签: c# internet-explorer selenium driver

我的应用程序必须在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异常,有时仍会崩溃。我不知道该怎么做才能让这项工作始终如一。另外,我是该领域的新手,所以我不确定在第二版中编写代码是不是很糟糕。非常感谢任何帮助。

1 个答案:

答案 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
  • 查找WebElement
  • 区别在于,直到您选择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;
        }
}