首页 > 解决方案 > 等待元素的可见性

问题描述

使用 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 的一部分。

以前,在进行搜索时,我会做一个

 waitForXpathVisibility("//li[@class='ui-menu-item']");

这将返回。但是搜索总是找到第一个,所以上面的xpath会指向第一个英文的,这将不再可见,所以会超时。

有没有办法等待与 xpath 匹配的任何元素可见?请注意,visibilityOfAllElements() 将不起作用,因为它们并非全部可见。

我想可以做的是事先计算所有元素的数量,@id 和“宽度”作为样式的一部分。"display; none" 将不起作用,因为还有其他具有此值的 s。然后进行搜索,等待s的个数加1,得到最后一个的id,然后等待一个

  • 在它下面变得可见,但这似乎有点多。应该有办法等待一个可见的
  • ? 然后我可以返回它的父母

  • 标签: javaseleniumxpath

    解决方案


    我想你正在寻找的是

    //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);
    

    推荐阅读