【问题标题】:python selenium - selecting option from dropdownpython selenium - 从下拉列表中选择选项
【发布时间】:2017-11-13 01:58:10
【问题描述】:

我正在尝试使用以下代码来使用 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()

在某些情况下它可以工作(并且选择了下拉列表中的选项),但在其他情况下未选择下拉列表中的选项(并且也没有引发错误)。

对于如何从提供的代码中注明的下拉列表中始终选择选项的任何反馈,我将不胜感激。

【问题讨论】:

  • 你让它变得更复杂,比它应该的更复杂 - 请看 Select class selenium-python.readthedocs.io/navigating.html#filling-in-forms
  • 发布指向页面或相关 HTML 的链接
  • 感谢@JeffC - 页面链接在代码中,分配给名为 url 的变量
  • @SAZ 它实际上不是SELECT 元素,所以这无济于事。
  • 我尝试了所有方法。Eb=ven 尝试使用 javascript 执行器,但它们对我不起作用。使用 while 循环或使用 time.sleep(1) 1 秒即可。

标签: python selenium


【解决方案1】:

我不会尝试操纵元素的 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 没有 visibilityOfAllElementsLocatedBy() 像 Java 那样,所以我必须等待单个元素,然后获取所有元素,然后单击第一个元素。如果你真的只想点击第一个,你可以这样做

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

并跳过最后两行代码。我保持原样是因为我假设你会想要(绝地思维能力在你身上)把它扔到一个函数中并选择不同的选项。

【讨论】:

    【解决方案2】:
    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()
    

    【讨论】:

    • 虽然这在理论上可以回答问题,但最好包括对您的代码及其如何回答问题的解释。
    【解决方案3】:

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

    driver.find_element_by_xpath("//span[@class='k-input' and text()='Select residential status']").click()
    

    那么只有在居住状态列表可见时才可以点击想要的项目(aria-hidden='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()
    

    【讨论】:

      【解决方案4】:

      没有 Select() 的下拉菜单

      我记得我在使用 Selenium 时遇到了一些非常烦人的问题,而没有 Select()

      使用 ActionsChains 模块

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

      from selenium.webdriver.common.action_chains import ActionChains
      from selenium.webdriver.common.by import By
      

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

      actions = ActionsChains(browser)        
      dropdown = browser.find_element(By.XPATH, "//*[text()='dropdown option']").click()
      actions.click(on_element=dropdown)
      actions.perform()
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-24
        • 2015-03-13
        • 1970-01-01
        • 1970-01-01
        • 2022-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多