2016-06-28 64 views
0

我有以下示例,其中字段將顯示或不顯示,具體取決於您選擇的報告。使用Selenium WebDriver查找具有動態ID的字段c#

在硒代碼字段已被定義爲:

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

HTML:

<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> 

如果我選擇(報告1)

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)

1) Then Field 2 is removed (id="ctl00_MainContent_cntrlDynamicField2") 
2) As only 2 Fields are now displayed on the screen the ID's are now as follows 
3) Field 1: (id="ctl00_MainContent_cntrlDynamicField1") 
4) Field 3: (id="ctl00_MainContent_cntrlDynamicField2") 

自動化將始終失敗,因爲我想使用字段3但ID已更改。

硒腳本是從xls表單驅動的數據。

如何繼續查找Field3,即使通過ID已動態更改。

回答

0

這真是太遺憾了<td><span>Field3</span></td>不是for屬性指向正確對象的標籤。在這種情況下,您可以根據文本標籤進行識別。

這種情況有解決方法有兩種:要麼使用jQuery找到,因爲硒的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

0

下面的代碼獲取每個錶行,並查找文本「字段3」。一旦找到該文本,它將從該行中檢索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; 
    } 
} 
相關問題