我试图使用下面的代码使用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()在某些情况下,它可以工作(从下拉列表中选择一个选项),但在其他情况下,没有选择下拉列表中的选项(也没有出现错误)。
我希望有任何反馈意见,如何始终如一地从下拉列表中选择一个选项,并在代码中注明。
发布于 2017-11-13 05:53:19
我不会试图操纵元素的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那样的visibilityOfAllElementsLocatedBy(),所以我不得不等待单个元素,然后获取所有元素,然后单击第一个元素。如果你真的想点击第一个,你可以只做
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#ddResidentialStatusId__1_listbox > li"))).click()跳过最后两行代码。我之所以留下它,是因为我假设你会想(绝地心灵力量在你身上发挥作用),把它扔到一个函数里,然后选择不同的选项。
发布于 2017-11-13 04:57:37
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()发布于 2017-11-13 06:07:12
首先,您可以单击始终可单击的复选框。
driver.find_element_by_xpath("//span[@class='k-input' and text()='Select residential status']").click()然后,只有当居住状态列表可见时,才能单击所需的项(aria-隐含=‘false’)
driver.find_element_by_xpath("//ul[@id='ddResidentialStatusId__1_listbox' and @aria-hidden='false']/li[@class='k-item' and text()='Other']").click()为了工作,这个解决方案需要设置内嵌等待您的脚本
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()https://stackoverflow.com/questions/47256089
复制相似问题