我有以下示例,其中将显示或不显示字段,具体取决于您选择的报告。
在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。
答案 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;
}
}