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

Java 如何循环浏览WebElement列表并选择一个具有条件的WebElement?,java,selenium-webdriver,Java,Selenium Webdriver,我将SeleniumWebDriver与Java一起使用。我正在尝试创建一个方法,该方法在WebElements列表中循环,以返回第一个包含文本“Ooga Booga”的WebElement,如果列表中没有包含此文本的元素,则返回null public class myClass { private static WebElement element = null; private static List<WebElement> elements = null; public

我将SeleniumWebDriver与Java一起使用。我正在尝试创建一个方法,该方法在WebElements列表中循环,以返回第一个包含文本“Ooga Booga”的WebElement,如果列表中没有包含此文本的元素,则返回null

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;
}
如何在忽略列表中没有“someDiv”的元素的情况下继续循环列表

<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”中搜索文本。

使用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;
            }
        }
    }
for(WebElement:elements){
List可能有someDiv=element.findElements(By.cssSelector(“someDiv”);
if(可能有somediv.size()>0){
//如果需要多个someDiv类型的div,则可以迭代列表。
字符串myText=mightHaveSomeDiv.get(0.getText();
if(myText.contains(“Ooga Booga”)){
返回元素;
}
}
}

使用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;
            }
        }
    }
for(WebElement:elements){
List可能有someDiv=element.findElements(By.cssSelector(“someDiv”);
if(可能有somediv.size()>0){
//如果需要多个someDiv类型的div,则可以迭代列表。
字符串myText=mightHaveSomeDiv.get(0.getText();
if(myText.contains(“Ooga Booga”)){
返回元素;
}
}
}

顺便说一句,我建议尝试摆脱这样的静态方法。它会使你的生活成为一个活地狱,因为它是静态的。使用它的一切都开始需要静态

不管怎样,让我们把它分解一下。此cssSelector允许您通过标记名而不是类名获取子div

By.cssSelector(".someSelector div")
现在我们有了WebElement的列表,它们都是div元素,让我们只查找div中的文本。不必担心class属性

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元素中分离出来。如果想要精确匹配,您必须调整逻辑。

顺便说一句,我建议您尝试摆脱这种静态方法。它会使你的生活成为一个活地狱,因为它是静态的。使用它的一切都开始需要静态

不管怎样,让我们把它分解一下。此cssSelector允许您通过标记名而不是类名获取子div

By.cssSelector(".someSelector div")
现在我们有了WebElement的列表,它们都是div元素,让我们只查找div中的文本。不必担心class属性

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元素中分离出来。如果想要精确匹配,您必须调整逻辑。

这是您的答案。。首先声明父web定位器

WebElement element1 = driver.findElement(By.id("##abc##"));
现在,如果您想在上面定义的定位器内执行任何操作或任何事情,则可以按如下方式执行:

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

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

重要=请记住在任何子元素的开头保留一个

这是你的答案。。首先声明父web定位器

WebElement element1 = driver.findElement(By.id("##abc##"));
现在,如果您想在上面定义的定位器内执行任何操作或任何事情,则可以按如下方式执行:

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

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

重要=请记住在任何子元素的开头保留一个

什么是someDiv?这是标记名div还是其他css路径定位器?您提到了属性,所以我假设使用类名或某种类型。如果是这样,您可能可以使用不需要该类名的其他cssSelector。尝试通过元素标记名获取列表。您不必担心这样会丢失属性,因为这是另一个CSS路径定位器。。我想这个类比可能会有所帮助:我在一副牌中循环。我一直在看这些卡片,直到我找到一个红心之王。我正在搜索每一张卡片
someSelector
,检查它是否是心脏
someDiv
,然后检查它是否是King
myText
。只要牌组中的每一张牌都是一颗心,这就行了。。但当我碰到黑桃的那一刻,这将抛出一个无触点的例外,因为它在牌中看不到一颗心。我正在寻找一种方法,例如
isEmpty()
,但是只需要一个
WebElement
。我们所做的只是猜测,我用htmlWhat is someDiv更新了这个问题?这是标记名div还是其他css路径定位器?您提到了属性,所以我假设使用类名或某种类型。如果是这样,您可能可以使用不需要该类名的其他cssSelector。尝试通过元素标记名获取列表。您不必担心这样会丢失属性,因为这是另一个CSS路径定位器。。我想这个类比可能会有所帮助:我在一副牌中循环。我一直在看这些卡片,直到我找到一个红心之王。我正在搜索每一张卡片
someSelector
,检查它是否是心脏
someDiv
,然后检查它是否是King
myText
。只要牌组中的每一张牌都是一颗心,这就行了。。但当我碰到黑桃的那一刻,这将抛出一个无触点的例外,因为它在牌中看不到一颗心。我正在寻找一种方法,例如
isEmpty()
但是f