如何在父 <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());
}
我正在使用 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());
}