如何在父 <ul> 元素包含属性 style="display: none;" 到 Java Selenium 时创建自动完成 <li> 元素的列表

How to create a list of the autocomplete <li> elements when parent <ul> element contains the attribute style="display: none;" through Java Selenium

我正在使用 Java selenium 创建一个自动化项目。现在在我们的网络应用程序中,有地址输入框并具有自动完成功能。问题是在输入部分地址后,我们需要单击列表中的一个选项。这是 html:

现在我尝试获取列表。但失败了:

WebElement autoCompelet = driver.findElement(By.xpath("/html/body/ul[1]"));
List<WebElement> options = autoCompelet.findElements(By.tagName("li"));
logger.debug(options.size());
for (WebElement option1 : options) {
    logger.debug(option1);
}

我可以打印出来,但是

  • 列表是空的。 我也试过使用像这样的等待方法:

    WebDriverWait wait = new WebDriverWait(driver, 10);
    wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("/html/body/ul[1]/li[1]")));
    

    不幸的是,其中 none 个有效。有人对此有任何想法吗?任何输入表示赞赏。谢谢大家。

  • By.className("li")无效,取值应为class名称,需要用By.tagName("li")代替。

    你也可以改变你的xpath,通过class获取ul,然后直接获取li

    WebElement autoCompelet = driver.findElement(By.xpath("//ul[@class='af_list']"));
    List<WebElement> options = autoCompelet.findElements(By.tagName("li"));
    logger.debug(options.size());
    for (WebElement option1 : options) {
        logger.debug(option1);
    }
    

    您可以尝试以下方法。

        //wait is added in order to check the presence of autocomplete suggestion 
        WebDriverWait wait=new WebDriverWait(driver,20);
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("af_list")));
    
        List<WebElement> options = driver.findElements(By.xpath("//ul[@class='af_list']/li"));
        logger.debug(options.size());
        for (WebElement option1 : options) {
            logger.debug(option1.getText());
        }
    

    注意:我假设 af_list class 名称仅在 autocomplete.If 中使用,它也用于其他部分,那么请分享完整的 html详情

    您可以尝试这样的操作,在 list 中包含所有 <li> 元素后,您可以使用 [=] 轻松获取每个 Web 元素的文本12=] 方法在 selenium Java binding.[=14= 中可用]

    List<WebElement> options = driver.findElements(By.cssSelector("ul.af_list li"));
     System.out.println(options.size());
     logger.debug(options.size());
     for(WebElement options1 : options)
      {
        logger.debug(options1.getText());
       }
    

    请注意,在 xpath[= 上使用 css selector 始终是一个好习惯29=]。

    您可能想为您的场景引入 webDriverWait。这将明确等待所有 <li> 元素成为列表中的 present/available。

    希望这会有所帮助。

    我在我们的网络应用程序中有一个类似的功能。在这种情况下,您可以使用 sendKeys() 方法和 Keys.DOWN 直接转到该元素,然后 Keys.ENTER 到 select 它。通常,一旦您 sendKeys() 文本的一部分,其他文本就会开始在下方填充,因此您基本上会输入一定程度,直到填充的 dropdown 文本中的第一个选项就是那个你要哪个。然后执行 sendKeys(Keys.DOWN) 然后执行 sendKeys(Keys.ENTER)

    根据您分享的 HTML,所需元素即 <li> 标签位于 <ul> 标签内属性 style="display: none;"。因此,要访问 <li> 标签,您可以使用以下解决方案:

    WebElement autoCompelet = driver.findElement(By.xpath("//ul[@class='af_list']"));
    ((JavascriptExecutor)driver).executeScript("arguments[0].removeAttribute('style')", autoCompelet);
    List<WebElement> options = autoCompelet.findElements(By.xpath("./li[@class='af_item']"));
    for (WebElement option1 : options) {
        System.out.println(option1.getText());
    }