在webdriver中找到两个元素中的任何一个

pav*_*lou 16 selenium webdriver selenium-webdriver

在我的应用程序中,当我打开页面XI期望看到元素A或元素B.它们被放置在DOM中的不同位置并且可以使用它们的ID找到,例如 driver.findElement(By.id("idA"))

如何让webdriver找到A或B?

driver.findElements(By)当找到至少一个元素时,有一种方法会停止等待,但这种方法迫使我对A和B使用相同的定位器.

可靠地找到A或B的正确方法是什么,这样我就不必等待隐式超时?

eug*_*kov 19

id为I1的元素或id为I2的元素

XPath的: //E1[@id=I1] | //E2[@id=I2]

CSS: css=E1#I1,E2#I2

driver.findElement(By.xpath(//E1[@id=I1] | //E2[@id=I2]))
driver.findElement(By.cssSelector(E1#I1,E2#I2))
Run Code Online (Sandbox Code Playgroud)

不要忘记fluentWait机制:

public WebElement fluentWait(final By locator){

        Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
                .withTimeout(30, TimeUnit.SECONDS)
                .pollingEvery(5, TimeUnit.SECONDS)
                .ignoring(org.openqa.selenium.NoSuchElementException.class);

        WebElement foo = wait.until(
                new Function<WebDriver, WebElement>() {
                    public WebElement apply(WebDriver driver) {
                        return driver.findElement(locator);
                    }
                }
        );
        return  foo;
};
Run Code Online (Sandbox Code Playgroud)

你可以在这里获得更多关于fluentWait的信息

恕我直言的问题解决方案如下:

fluentWait(By.xpath(//E1[@id=I1] | //E2[@id=I2]));
fluentWait(By.cssSelector(E1#I1,E2#I2))
Run Code Online (Sandbox Code Playgroud)

仅供参考:是很好的xpath,cssSelector手册

希望这能帮助你.