如何循环浏览WebElements列表并选择一个具有条件的WebElement?

时间:2016-09-27 22:42:45

标签: java selenium-webdriver

我正在使用Selenium WebDriver和Java。我正在尝试创建一个循环遍历WebElements列表的方法,以返回包含文本" Ooga Booga"的第一个WebElement,如果列表中没有包含此文本的元素,则返回null。 / p>

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

这一切都正常,直到我遇到一个没有这个属性的元素:

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

如何在忽略任何没有&#34; someDiv&#34;的元素的同时继续遍历我的列表。在里面?

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

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

我需要在div&#34; classC&#34;。

中搜索文本

3 个答案:

答案 0 :(得分: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;
            }
        }
    }

答案 1 :(得分:1)

这是您的答案。.首先声明一个父网站定位器

WebElement element1 = driver.findElement(By.id("##abc##"));

现在,如果您想在上面定义的定位器中执行任何操作或执行任何操作,则可以按以下步骤进行操作:

element1.findElement(By.xpath("  .        //##yourFurtherLocABC")).click();

element1.findElement(By.xpath("  .      //##yourFurtherLocXYZ")).getText();

重要 =切记在所有子元素的开头都保留一个.

答案 2 :(得分:0)

不过,我建议尝试脱离这样的静态方法。它会让你的生活变得生硬,因为它是静止的。使用它的一切都开始需要静态。

无论如何,让我们把它分解。此cssSelector将允许您通过标记名而不是类名来获取子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”的div,您将获得多个WebElements,而您接下来使用它可能不是您所期望的。实际上,此警告也应适用于循环。它将突破你的第一个包含“Ooga Booga”的div元素。如果想要完全匹配,则必须调整逻辑。