Selenium在Javascript中,从下拉列表中选择元素

Selenium在Javascript中,从下拉列表中选择元素,javascript,selenium,selenium-webdriver,selenium-chromedriver,Javascript,Selenium,Selenium Webdriver,Selenium Chromedriver,我试图从下拉列表中获取一个元素,选择它并进行浏览,但我做不到 我知道我想从下拉列表中选择的元素的xpath是: /html/body/div[1]/div/div[1]/div[1]/div[2]/div/div/div[1]/div[2]/div[1]/div/div/div/div[2]/div/div/ul/li[2] 而下拉窗口具有id rw_2_输入 下拉列表允许您从五个选项中选择一个:小于18、18-40、40-60等等;所以我做了: // select the dropdown

我试图从下拉列表中获取一个元素,选择它并进行浏览,但我做不到

我知道我想从下拉列表中选择的元素的xpath是:

/html/body/div[1]/div/div[1]/div[1]/div[2]/div/div/div[1]/div[2]/div[1]/div/div/div/div[2]/div/div/ul/li[2]
而下拉窗口具有id rw_2_输入

下拉列表允许您从五个选项中选择一个:小于18、18-40、40-60等等;所以我做了:

// select the dropdown and click on it
const age = await driver.findElement(By.id('rw_2_input'))
await age.click()
然后

在文件顶部,我使用了这些导入:

const { Builder, By, Key, util } = require('selenium-webdriver')
const chrome = require('selenium-webdriver/chrome')
const expect = require('expect')
const { elementIsVisible } = require('selenium-webdriver/lib/until')
我的问题是,它说直到没有定义

我肯定我在进口方面做错了什么,但我不知道是什么。 我试图了解什么和如何导入,但我没有任何线索。 如果我尝试使用

const ageChoice = await driver.findElement(By.xpath('/html/body/div[1]/div/div[1]/div[1]/div[2]/div/div/div[1]/div[2]/div[1]/div/div/div/div[2]/div/div/ul/li[2]'))
await ageChoice.click()
上面说

ElementNotInteractableError: element not interactable
为什么它不应该是可交互的??我不明白

* * *

*****更新:*****

我设法解决了一些问题,但仍然说元素不可交互: 我所做的是

const ageChoice = await driver.findElement(By.xpath("//li[contains(text(),'Tra 19 e 40')]"))
await ageChoice.click()

如果我注释掉.click函数,一切都正常;但是,我没有选择该选项。既然它说它不可交互,我怎么能选择它呢?

这可能是一个快速修复方法。这不是解决办法。您可以使用以下命令driver.executeScriptcommand在网页上执行JavaScript

按ID或其他方式选择要单击并执行JavaScript的元素,例如:


driver.executeScript'document.getElementById'someID'。单击“

我终于解决了问题所在。我将在这里发布供将来参考

我的页面中有两个下拉列表,当我从第一个下拉列表中选择一个选项时,选项会临时覆盖第二个下拉列表,这会导致无法交互的错误

在发现这一点后,我花了几个小时,因为在纪录片中没有人对这一点说什么,所以我设法等待第一个下拉列表关闭

基本上,您必须同时进行两项检查:

表示元素是可见的

b确保它已启用

没有支票,没有当事人,因此代码变成:

const ageChoice = await driver.findElement(By.xpath("//li[contains(text(),'Tra 19 e 40')]"))
await driver.wait(until.elementIsVisible(ageChoice), 3000)
await driver.wait(until.elementIsEnabled(ageChoice), 3000)
await ageChoice.click()
这样,它终于起作用了

请注意,如果使用wait-until-elementIsVisible和elementisnabled,则不需要等到elementLocated:您不需要使用此代码

const ageChoice = await driver.wait(until.elementLocated(By.xpath(By.xpath("//li[contains(text(),'Tra 19 e 40')]"))
相反,当您不执行这两项检查时,必须使用此代码,但该元素位于包含大量下拉列表的页面底部,并且在到达该元素之前进入超时状态。在这种情况下,使用

const ageChoice = await driver.wait(until.elementLocated(By.xpath(By.xpath("//li[contains(text(),'Tra 19 e 40')]"))
ageChoice.click()

不幸的是,这能帮助util=require'util'吗?但幸运的是,我得到了const{Builder,By,Key,until}=require'selenium-webdriver'
const ageChoice = await driver.wait(until.elementLocated(By.xpath(By.xpath("//li[contains(text(),'Tra 19 e 40')]"))
ageChoice.click()