2016-09-27 90 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元素。如果你想精确匹配,你将不得不调整逻辑。

相关问题