等待元素的可见性

时间:2019-04-17 11:54:44

标签: java selenium xpath

使用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,然后等待其下的

  • 可见,但这似乎有点多。应该有某种方式等待可见的
  • ?然后我可以返回其父

  • 2 个答案:

    答案 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);