2015-11-02 66 views
0

我有一個ul,它包含2個具有相同類名稱和所有其他屬性的列表,除了它們的文本值。見下面基於文本訪問元素 - Selenium WebDriver Java

修改後的代碼的HTML代碼:

<table class="day-form-clause"> 
    <tbody> 
     <tr> 
      <td>Buy Assets:</td> 
      <td> 
       <div class="btn-group open"> 
        <ul class="dropdown-menu" role="menu"> 
         <li class="ng-scope" ng-repeat="option in beforeOrAfter"> 
          <a class="ng-binding" ng-click="setStartBeforeOrAfter(option)"> Trading Days Before </a> 
         </li> 
         <li class="ng-scope" ng-repeat="option in beforeOrAfter"> 
          <a class="ng-binding" ng-click="setStartBeforeOrAfter(option)"> Trading Days After </a> 
         </li> 
        </ul> 
       </div> 
      </td> 
     </tr> 
     <tr> 
      <td>Sell Assets:</td> 
      <td> 
       <div class="btn-group open"> 
        <ul class="dropdown-menu" role="menu"> 
         <li class="ng-scope" ng-repeat="option in beforeOrAfter"> 
          <a class="ng-binding" ng-click="setStartBeforeOrAfter(option)"> Trading Days Before </a> 
         </li> 
         <li class="ng-scope" ng-repeat="option in beforeOrAfter"> 
          <a class="ng-binding" ng-click="setStartBeforeOrAfter(option)"> Trading Days After </a> 
         </li> 
        </ul> 
       </div> 
      </td> 
     </tr> 
    </tbody> 
</table> 

在上面的代碼中,有兩列(購買資產)和(出售資產),而這兩列的各有2名列表。列表(文本,屬性)的內容在兩列中完全相同。現在

,如果我用

driver.find_elements_by_xpath("//*[contains(text(), 'Trading Days Before')]") 

或者

WebElement element = driver.findElement(
    By.cssSelector("ul.dropdown-menu li:nth-of-type(2) > a[ng-click*='BeforeOrAfter']") 
); 

這將返回我2層匹配的節點,一個從 'TD =購買資產',並從「TD其他=出售資產」。

如果我只想從'td = Buy Assets'訪問文本(交易日前)該怎麼辦。我將如何實現這一目標?

回答

0

使用XPath,並選擇通過文字:

driver.find_elements_by_xpath("//*[contains(text(), 'Trading Days Before')]")driver.find_elements_by_xpath("//*[contains(text(), 'Trading Days After')]")

+0

關於是否存在我的代碼爲2列,就像我上面​​購買資產代碼塊,並且代碼​​出售資產同一塊什麼。您的上述解決方案會返回兩個匹配的節點,一個來自購買資產,另一個來自銷售資產 – Uziii

0

使用JavaScriptExecutor。這會工作。

樣品例如

String jScript = "var myList = document.getElementsByClassName(\"selectBox-label\");" + "myList[0].innerHTML=\"YourNumber\";"; 
JavascriptExecutor executor = (JavascriptExecutor)driver; 
executor.executeScript(jScript); 
0

往往不是,這種定位將是靜態的,所以這很可能會是安全的使用方法:-的型第n個CSS和不是文本的基礎上。

像這樣的工作:

WebElement element = driver.findElement(
    By.cssSelector("ul.dropdown-menu li:nth-of-type(2) > a[ng-click*='BeforeOrAfter']") 
); 

我對這種推理,是因爲邏輯的。邏輯指出,如果「之後」之前的「之前」,那麼這將是一個應用程序錯誤。任何時候你看到「前後」都是相應的。 「之前」應始終在之前「之後」,因此:nth-of-type(2)之後,以及:nth-of-type(1)之前。

我只是提供一個替代視角,將解決您的問題,而不需要文本匹配。

編輯:同樣的事情關於買入/賣出。假設買入和賣出不會改變,那麼您可以僅爲賣出添加tr:nth-of-type(2),爲買入添加tr:nth-of-type(1)

WebElement buyTradingDaysBefore = driver.findElement(
    By.cssSelector("ul.dropdown-menu tr:nth-of-type(1) li:nth-of-type(1) > a[ng-click*='BeforeOrAfter']") 
); 

WebElement buyTradingDaysAfter = driver.findElement(
    By.cssSelector("ul.dropdown-menu tr:nth-of-type(1) li:nth-of-type(2) > a[ng-click*='BeforeOrAfter']") 
); 

WebElement sellTradingDaysBefore = driver.findElement(
    By.cssSelector("ul.dropdown-menu tr:nth-of-type(2) li:nth-of-type(1) > a[ng-click*='BeforeOrAfter']") 
); 

WebElement sellTradingDaysAfter = driver.findElement(
    By.cssSelector("ul.dropdown-menu tr:nth-of-type(2) li:nth-of-type(2) > a[ng-click*='BeforeOrAfter']") 
); 
+0

您是對的,我可以訪問這樣的數據,但我有其他問題。請參閱修訂後的HTML代碼和說明,並指導我。謝謝 – Uziii

+0

編輯我的答案,以適應 – sircapsalot

+0

這次沒有工作,與您的編輯版本 – Uziii

相關問題