当父<ul>元素包含属性style =“ display:none;”时,如何创建自动完成<li>元素的列表。通过Java Selenium

时间:2018-07-20 03:45:36

标签: java selenium selenium-webdriver display autosuggest

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

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

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]")));
    

    不幸的是,它们都不起作用。有人对此有任何想法吗?任何输入表示赞赏。谢谢你们。

  • 5 个答案:

    答案 0 :(得分:0)

    By.className("li")无效,该值应为类名,而必须使用By.Name("li")

    您还可以更改xpath,以按类获取ul,然后直接获取li

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

    答案 1 :(得分:0)

    您可以尝试以下操作。

        //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类名仅在自动完成中使用。如果在其他部分中也使用它,则请共享完整的html详细信息

    答案 2 :(得分:0)

    您可以尝试这样的操作,将所有<li>元素都放在一个列表中之后,可以使用getText()方法轻松地获取每个网络元素的文本,在 Java 绑定中可用。

    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 选择器

    您可能想为您的方案引入webDriverWait。这将明确地等待所有<li>元素在列表中出现/可用。

    希望这会有所帮助。

    答案 3 :(得分:0)

    我的Web应用程序具有类似的功能。在这种情况下,可以将sendKeys()方法与Keys.DOWN一起使用,逐字转到该元素,然后Keys.ENTER进行选择。通常,sendKeys()的一部分文本之后,其他部分开始在下面填充,因此您基本上输入了一定程度的文字,直到填充的下拉文本中的第一个选项才是您想要的那个。然后先进行sendKeys(Keys.DOWN),然后进行sendKeys(Keys.ENTER)

    答案 4 :(得分:0)

    根据您共享的 HTML ,所需元素(即<li>标签位于<ul>标签中,该标签具有属性 style =“ display :无;” 。因此,要访问<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());
    }