python selenium-从下拉列表中选择选项

python selenium-从下拉列表中选择选项,python,selenium,Python,Selenium,我试图使用下面的代码使用selenium(python)从网页上的下拉列表中选择一个选项 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC path_to_

我试图使用下面的代码使用selenium(python)从网页上的下拉列表中选择一个选项

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

path_to_chromedriver = 'C:/Users/User_1/chromedriver/chromedriver'
browser = webdriver.Chrome(executable_path = path_to_chromedriver)

url = 'https://lifeinsurance.rac.com.au/rac/get-a-quote?productid=51'
browser.get(url)

wait = WebDriverWait(browser, 10)

# residence listbox
drop_down = browser.find_element_by_xpath('//*[@id="divApplicantDetails__1"]/div[8]/div/div[2]/span/span/span[1]')

browser.execute_script('arguments[0].style.display="inline";', drop_down)
wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="divApplicantDetails__1"]/div[8]/div/div[2]/span/span/span[1]')))

wait.until(EC.element_to_be_clickable((By.XPATH, r'//*[@id="ddResidentialStatusId__1_listbox"]/li[1]'))).click()
在某些情况下,它是有效的(并且从下拉列表中选择了一个选项),但在其他情况下,从下拉列表中选择的选项没有被选中(并且也没有出现错误)


对于如何从提供的代码中的下拉列表中一致地选择选项,我将不胜感激。

我不会试图操纵元素的CSS。就像用户那样处理它。。。单击下拉列表,单击一个选项。我使用了不同的定位器,但这对我很有效

def select_resident_status(resident_status):
    // click the arrow down to make all options list out
    driver.find_element_by_css_selector('span[aria-owns*="ResidentialStatus"] span.k-select').click()

    // select option by pass-in option text
    driver.find_element_by_css_selector('div[id*="ResidentialStatus"][style*="display: block"] ul')
          .find_element_by_xpath('./li[text()="'+resident_status+'"]').click()
driver.find_element_by_css_selector("span[aria-owns='ddResidentialStatusId__1_listbox']")).click()
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#ddResidentialStatusId__1_listbox > li")))
options = driver.find_elements_by_css_selector("#ddResidentialStatusId__1_listbox > li"))
options[0].click() # clicks "Australian citizen or permanent resident"
python不像Java那样具有AllelementsLocatedBy()的可见性,因此我必须等待一个元素,然后获取所有元素,然后单击第一个元素。如果你真的想点击第一个,你可以这样做

wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#ddResidentialStatusId__1_listbox > li"))).click()

并跳过最后两行代码。我把它保留原样是因为我假设你会想(绝地心灵力量在你身上工作)把它放到一个函数中,然后选择不同的选项。

我不会试图操纵元素的CSS。就像用户那样处理它。。。单击下拉列表,单击一个选项。我使用了不同的定位器,但这对我很有效

driver.find_element_by_css_selector("span[aria-owns='ddResidentialStatusId__1_listbox']")).click()
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#ddResidentialStatusId__1_listbox > li")))
options = driver.find_elements_by_css_selector("#ddResidentialStatusId__1_listbox > li"))
options[0].click() # clicks "Australian citizen or permanent resident"
python不像Java那样具有AllelementsLocatedBy()的可见性,因此我必须等待一个元素,然后获取所有元素,然后单击第一个元素。如果你真的想点击第一个,你可以这样做

wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#ddResidentialStatusId__1_listbox > li"))).click()

并跳过最后两行代码。我把它保留原样是因为我假设你会想(绝地心灵力量在你身上工作)把它放到一个函数中,然后选择不同的选项。

首先你可以点击选择框,它总是可以点击的

driver.find_element_by_xpath("//span[@class='k-input' and text()='Select residential status']").click()
然后,只有在住宅状态列表可见时(aria hidden='false')才能单击所需项目

为了工作,此解决方案需要设置隐式等待脚本

driver = webdriver.Chrome(executable_path = path_to_chromedriver)
driver.implicitly_wait(5)
编辑:我做了更多的测试,但这个解决方案并不每次都有效。所以我建议你加一个小停顿,即使最好避免这样。在这种情况下,我认为它不是易碎的,因为它只用于允许列表框完全呈现

driver.find_element_by_xpath("//span[@class='k-input' and text()='Select residential status']").click()
driver.find_element_by_xpath("//ul[@id='ddResidentialStatusId__1_listbox' and @aria-hidden='false']")
time.sleep(1) 
driver.find_element_by_xpath("//ul[@id='ddResidentialStatusId__1_listbox' and @aria-hidden='false']/li[@class='k-item' and text()='Other']").click()

首先,您可以单击始终可单击的选择框

driver.find_element_by_xpath("//span[@class='k-input' and text()='Select residential status']").click()
然后,只有在住宅状态列表可见时(aria hidden='false')才能单击所需项目

为了工作,此解决方案需要设置隐式等待脚本

driver = webdriver.Chrome(executable_path = path_to_chromedriver)
driver.implicitly_wait(5)
编辑:我做了更多的测试,但这个解决方案并不每次都有效。所以我建议你加一个小停顿,即使最好避免这样。在这种情况下,我认为它不是易碎的,因为它只用于允许列表框完全呈现

driver.find_element_by_xpath("//span[@class='k-input' and text()='Select residential status']").click()
driver.find_element_by_xpath("//ul[@id='ddResidentialStatusId__1_listbox' and @aria-hidden='false']")
time.sleep(1) 
driver.find_element_by_xpath("//ul[@id='ddResidentialStatusId__1_listbox' and @aria-hidden='false']/li[@class='k-item' and text()='Other']").click()
不带Select()的下拉列表 我记得我有一些非常恼人的问题,关于Selenium的下拉列表,没有Select()

使用ActionsChains模块 要使用ActionsChains,您需要导入以下内容

通过文本选择下拉选项要容易得多

如果不起作用,请尝试插入time.sleep。

不带Select()的下拉列表 我记得我有一些非常恼人的问题,关于Selenium的下拉列表,没有Select()

使用ActionsChains模块 要使用ActionsChains,您需要导入以下内容

通过文本选择下拉选项要容易得多


如果不起作用,请尝试插入time.sleep。

如果你让它变得更加复杂,请查看Select class Post页面链接或相关的HTMLTanks@JeffC页面链接-代码中包含页面链接,分配给名为url@SAZ实际上,它不是一个
SELECT
元素,所以这不会有帮助。你让它变得更复杂,比它应该的更复杂-请查看SELECT类发布一个指向页面的链接或相关的htmltanks@JeffC-指向页面的链接在代码中,分配给名为url@SAZ实际上,它不是一个
SELECT
元素,因此没有帮助。虽然这在理论上可以回答问题,但最好包括对代码的解释以及它如何回答问题。虽然这在理论上可以回答问题,最好包括对代码的解释以及它如何回答问题。