使用Selenium WebDriver c#查找具有动态ID的字段

时间:2016-06-28 15:46:41

标签: c# html selenium-webdriver

我有以下示例,其中将显示或不显示字段,具体取决于您选择的报告。

在Selenium代码中,Fields被定义为:

try {
    final Double sum = future.get();
    result.add(sum);
} catch (ExecutionException e) {
    throw new RuntimeException(e);
} catch (InterruptedException e) {
    // log something here to indicate that the task has been interrupted.
}

HTML:

 By Field1 = By.Id("ctl00_MainContent_cntrlDynamicField1");
 By Field2 = By.Id("ctl00_MainContent_cntrlDynamicField2");
 By Field3 = By.Id("ctl00_MainContent_cntrlDynamicField3");

如果我选择(报告1)

<table>
<tbody>

<tr>
    <td>
        <span>Field1</span>
    </td>
    <td>
        <select id="ctl00_MainContent_cntrlDynamicField1"   
            <option value="1">Yes</option>
            <option value="0">No</option>
        </select>
    </td>
</tr>

<tr>
    <td>
        <span>Field2</span>
    </td>
    <td>
        <select id="ctl00_MainContent_cntrlDynamicField2"   
            <option value="1">Yes</option>
            <option value="0">No</option>
        </select>
    </td>
</tr>

<tr>
    <td>
        <span>Field3</span>
    </td>
    <td>
        <select id="ctl00_MainContent_cntrlDynamicField3"   
            <option value="1">Yes</option>
            <option value="0">No</option>
        </select>
    </td>
</tr>

</tbody>
</table>

如果我选择(报告3)

1) Then all Fields are displayed
2) Field 1: (id="ctl00_MainContent_cntrlDynamicField1")
3) Field 2: (id="ctl00_MainContent_cntrlDynamicField2")
4) Field 3: (id="ctl00_MainContent_cntrlDynamicField3") 

自动化将始终失败,因为我想使用字段3,但ID已更改。

selenium脚本是从xls表格驱动的数据。

即使ID已动态更改,我如何继续查找Field3。

2 个答案:

答案 0 :(得分:0)

遗憾的是,<td><span>Field3</span></td>不是指向正确对象的for属性的标签。在这种情况下,您可以根据文本标签进行识别。

有两种解决方法:使用jQuery来查找你的元素,因为selenium webdriver是IJavascriptExecutor ...你可以找到特定文本的跨度并使用: http://www.w3schools.com/jquery/traversing_closest.asp

另一个选项是使用By.CssSelector而不是By.Id,并且根据浏览器,您可以使用相邻的CSS选择器: https://developer.mozilla.org/en-US/docs/Web/CSS/Adjacent_sibling_selectors

答案 1 :(得分:0)

下面的代码抓取每个表格行并查找文本“Field3”。找到该文本后,它会从该行检索SELECT并将其存储在变量select中。

String searchText = "Field3";
List<WebElement> rows = driver.findElements(By.tagName("tr"));
for (WebElement row : rows)
{
    if (row.getText().contains(searchText))
    {
        Select select = new Select(row.findElement(By.tagName("select")));
        break;
    }
}