gpt4 book ai didi

java - 等待元素的可见性

转载 作者:行者123 更新时间:2023-11-30 12:06:10 27 4
gpt4 key购买 nike

使用 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,甚至是显示的 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 所有这些都可见。


    旁注...不要编写仅限于 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);

    关于java - 等待元素的可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55727021/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com