我想使用带有两个元素的wait.until(ExpectedConditions)
。我正在运行一个测试,我需要WebDriver
来等待Element1或Element2出现。那我就得去接谁先到。我试过了:
WebDriverWait wait = new WebDriverWait(driver, 60);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//h2[@class='....']"))) || wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//h3[@class='... ']")));
// Then I would need:
String result = driver.findElement(By.xpath("...")).getText() || driver.findElement(By.xpath("...")).getText();
总而言之,我需要等到这两个元素中的任何一个出现。然后接任何出现的人(他们不能同时出现)请帮帮忙。
9条答案
按热度按时间nhhxz33t1#
现在有一个本机解决方案,
or
方法,请查看文档。您可以这样使用它:
yfjy0ee72#
这是我在我的Helper类中声明的方法,它的工作方式非常出色。只需创建您自己的
ExpectedCondition
并使其返回定位器找到的任何元素:然后你可以这样使用它:
这里的
SERVICE_TITLE_LOCATOR
和ATTENTION_REQUEST_ALREADY_PRESENTS_WINDOW_LOCATOR
是页面的两个静态定位器。aydmsdu93#
我认为如果将“OR”放入XPath中,您的问题就有一个简单的解决方案。
然后,要打印结果,请使用以下命令:
x3naxklr4#
您还可以使用如下所示的CSSSelector:
用您在[...]中拥有的内容替换某些类和其他类在XPath中。
mqxuamgl5#
不幸的是,没有这样的命令。您可以通过尝试和捕捉来克服这个问题,或者我最好推荐您使用开放源码的Ruby库Watir。
4ngedf3f6#
还有一种等待的替代方法,但它没有使用预期的条件,而是使用了lambda表达式。
7cjasjjr7#
如果要满足的条件数量可变,则可以利用泛型列表,如here所示的Java的
ArrayList<>
,然后执行以下操作:uqxowvwt8#
uqjltbpv9#
对此有一个简单的解决方案,使用显式等待:
在此之前,我尝试使用
wait.until(ExpectedConditions.or(...
,它与2.53.0之前的Selify版本不兼容。