使用Java和Selenium。
我们有一个方法waitForXPathVisibility(xpath),最终该方法最终调用了wait.untilExpectedConditions ... visibleOfElement。此方法工作正常。我只是在这里缩写。因此,我感到不安,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'值都是随机计算的,因此没有从ID确定的方法。 此外,每个新搜索都会在上一个搜索的底部添加一个新的...
。 UL甚至显示的UL都将“显示;无”作为样式ID的一部分。
以前,当进行搜索时,我会做
waitForXpathVisibility("//li[@class='ui-menu-item']");
将返回。但是搜索总是找到第一个,因此上面的xpath将指向第一个英语,它将不再可见,因此将超时。
有没有办法等待与xpath匹配的任何元素可见?请注意,visibleOfAllElements()将不起作用,因为它们不会全部可见。
我想可以做的是事先获取所有带有@id和样式中“宽度”的元素的计数。 “ display; none”将不起作用,因为还有其他s具有该值。然后进行搜索,并等待s的数量增加1,获取最后一个的id,然后等待其下的
答案 0 :(得分:0)
使用JavaScript
执行程序获取隐藏值。如果要获取Neurologa
的值,请尝试以下代码。希望获得帮助。
WebElement element=driver.findElement(By.xpath("(//ul[@id='ui-id-2']/li[@class='ui-menu-item'])[1]"));
JavascriptExecutor js = (JavascriptExecutor) driver;
String output=(String) js.executeScript("return arguments[0].innerHTML;", element);
System.out.println(output);
OR
WebElement element=driver.findElement(By.xpath("//li[@class='ui-menu-item'][normalize-space(text())='Neurologa']"));
JavascriptExecutor js = (JavascriptExecutor) driver;
String output=(String) js.executeScript("return arguments[0].innerHTML;", element);
System.out.println(output);
答案 1 :(得分:0)
我认为您正在寻找的是
//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
等到所有这些内容都可见。
旁注...不要编写仅限于XPath的方法waitForXPathVisibility()
。这使得您必须为所使用的每种定位器类型(CSS选择器,名称,ID等)编写一个方法。取而代之的是使用By
作为参数。见下文。
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);