2016-09-27 33 views
0

我正在使用Selenium WebDriver和Java。我正在嘗試創建一個循環遍歷WebElements列表以返回包含文本「Ooga Booga」的第一個WebElement的方法,如果列表中沒有包含此文本的元素,則返回null。如何循環訪問WebElements列表並選擇一個具有條件的WebElement?

String myText = element.findElement(By.cssSelector("classC")).getText(); 

我怎樣才能繼續循環通過我的列表,而忽略任何元素沒有「someDiv:

public class myClass { 
private static WebElement element = null; 
private static List<WebElement> elements = null; 

public static WebElement returnOneElement (WebDriver driver){ 
    elements = driver.findElements(By.cssSelector("someSelector")); 
    for (WebElement element : elements){ 
     String myText = element.findElement(By.cssSelector("classC")).getText(); 
     if (myText.contains("Ooga Booga")) { 
      return element; 
     } 
    } 
    return null; 
} 

,直到我遇到不具有這種屬性的元素這一切工作正常「裏面呢?

<div class="someSelector"> 
    <div class="classA"> 
    <div class="classB"> 
</div> 

<div class="someSelector"> 
    <div class="classA"> 
    <div class="classB"> 
    <div class="classC"> 
</div> 

我需要搜索div「classC」中的文本。

+0

SomeDiv是什麼?那是標記名div,還是其他一些css路徑定位器?你提到的屬性,所以我假設一個類名或某種類型。如果是這樣,你可以使用不需要該類名的另一個cssSelector。嘗試通過元素標記名獲取列表。你不必擔心這種方式丟失屬性 – robx

+0

這是另一個CSS路徑定位器..我想這個比喻可能有所幫助: 我正在循環一副牌。我繼續瀏覽這些卡片,直到我找到一顆心靈之王。我正在搜索每個卡'someSelector',並檢查它是否是一個心臟'someDiv',然後檢查它是否是King'myText'。只要套牌中的每張牌都是一顆心,這種方式就可以正常工作。但是當我遇到一個Spade的時候,這將拋出一個NoSuchElementException,因爲它沒有在卡中看到一個Heart。我正在尋找一種方法,比如'isEmpty()',但對於單個'WebElement'。 – qaNoob

+0

對不起,我明白你想要什麼,但很難幫助沒有HTML。我們所要做的只是猜測 – robx

回答

1

使用findElement-S方法如下所示。

for (WebElement element : elements) { 
     List<WebElement> mightHaveSomeDiv = element.findElements(By.cssSelector("someDiv")); 

     if (mightHaveSomeDiv.size() > 0) { 
      //Can iterate the list if you expect more than one div of type someDiv. 
      String myText = mightHaveSomeDiv.get(0).getText(); 
      if (myText.contains("Ooga Booga")) { 
       return element; 
      } 
     } 
    } 
0

順便說一句,我會建議嘗試擺脫這種靜態方法。由於它是靜態的,它會讓你的生活在以後變得活生生的。一切使用它開始想要靜態。

無論如何,讓我們分解它。這個cssSelector將允許你通過標記名而不是classname來獲取子div。

By.cssSelector(".someSelector div") 

既然我們有一個WebElement的列表,它們都是div元素,我們只需要在div中查找文本即可。無需擔心類屬性

public static WebElement returnOneElement (WebDriver driver){ 
      elements = driver.findElements(By.cssSelector(".someSelector div")); 
      for (WebElement element : elements){ 
       if(element.getText().contains("Ooga Booga")) { 
        return element; 
       } 
      }  
     return null; 
    } 

或者,你可以直接與XPath定位找到目標如

//div[@class='someSelector']//div[contains(.,'Ooga Booga')] 

即使被警告,如果你有一個包含文本「OOGA Booga多格「,你會得到多個WebElements,接下來你做什麼可能不是你所期望的。實際上,這個警告也應該適用於循環。它會突破你的第一個包含「Ooga Booga」的div元素。如果你想精確匹配,你將不得不調整邏輯。

相關問題