java - 等待元素的可见性
问题描述
使用 Java 和 Selenium。
我们有一个方法 waitForXPathVisibility(xpath),它最终会调用 wait.untilExpectedConditions... visibilityOfElement。这种方法效果很好。我只是在这里缩写。所以相信我,waitForXpathVisibility(xpath) 会等到它可见。
所以我们有一页医学专业。它最初只是英文的。因此,如果您搜索“neuro”,HTML 将类似于
<ul id="ui-id-1" tabindex="0" class="ui-menu ui-widget ui-widget-content ui-autocomplete ui-front" style="width: 476.672px; position: relative; top: -1005px; left: 542.828px; display: none;">
<LI class="ui-menu-item"> Neurology</Li>
<LI class="ui-menu-item"> Neuro Surgeon </li>
</UL>
然后他们添加了西班牙语,因此并非所有结果都会返回,但只有西班牙语可见。一个新的
- 在底部添加。
<ul id="ui-id-2" tabindex="0" class="ui-menu ui-widget ui-widget-content ui-autocomplete ui-front" style="width: 476.672px; position: relative; top: -1005px; left: 542.828px; display: none;">
<LI class="ui-menu-item"> Neurologa </LI>
<LI class="ui-menu-item"> Neurologo Cirujano </LI>
</UL>
LI 中有一个类字段,但每个 LI 都是相同的(即,无法区分语言和 LI。此外,每个 'id' 的值是随机计算的,因此无法确定来自 id. 此外,每个新的搜索都会附加一个新的 ...
到前一个的底部。并且 UL,即使是显示的,也有“显示;无”作为样式 ID 的一部分。以前,在进行搜索时,我会做一个
waitForXpathVisibility("//li[@class='ui-menu-item']");
这将返回。但是搜索总是找到第一个,所以上面的xpath会指向第一个英文的,这将不再可见,所以会超时。
有没有办法等待与 xpath 匹配的任何元素可见?请注意,visibilityOfAllElements() 将不起作用,因为它们并非全部可见。
我想可以做的是事先计算所有元素的数量,@id 和“宽度”作为样式的一部分。"display; none" 将不起作用,因为还有其他具有此值的 s。然后进行搜索,等待s的个数加1,得到最后一个的id,然后等待一个
解决方案
我想你正在寻找的是
//ul[contains(@class,'ui-menu')][last()]/li
^ finds a UL
^ that contains the 'ui-menu' class
^ get the last one (the one that contains visible elements)
^ get the LI children
您应该能够等到所有这些都使用visibilityOfAllElements
.
旁注...不要编写waitForXPathVisibility()
仅限于 XPath 的方法。这使得您必须为您使用的每种定位器类型(CSS 选择器、名称、id 等)编写一个方法。而是将 aBy
作为参数并使其通用。见下文。
public void waitForVisibilityOfElement(By locator)
{
new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfElementLocated(locator));
}
您也可以为多个元素编写一个
public void waitForVisibilityOfElements(By locator)
{
new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(locator));
}
你像使用它一样
By someElementLocator = By.id("someId");
By someElementLocator = By.xpath("//ul[contains(@class,'ui-menu')][last()]/li"); // or this
By someElementLocator = By.cssSelector("ul.ui-menu"); // or this
waitForVisibilityOfElement(someElementLocator);
推荐阅读
- jmeter - 在 JMeter 中配置没有端口号的 HTTP 采样器
- python - 在特定列Python中选择具有唯一值的csv行
- php - 使用 SDK for PHP 从谷歌驱动器下载 zip 文件
- html - 如何将字符串转换为html?
- r - R中的图例:删除左边的空格转到该行
- bash - Cron 作业不执行 shell 脚本
- javascript - 如何更改 Loopback API Explorer 标头颜色和名称?
- r - R - 根据另一列的第一次出现修改列值
- python - Django - 将 URL 作为 URL 参数传递
- excel - Excel VBA 合并数据并删除