【问题标题】:How to select a dropdown using Selenium?如何使用 Selenium 选择下拉菜单?
【发布时间】:2020-08-23 07:49:07
【问题描述】:

我正在尝试从此 HTML 的下拉列表中选择 EU Odds

<div id="user-header-r1">
            <div>
                <a class="user-header-fakeselect" onclick="ElementSelect.expand( 'user-header-oddsformat' , 'user-header-oddsformat-expander' )" id="user-header-oddsformat-expander"><span>UK Odds</span></a>
                <ul class="user-header-fakeselect-options hidden" id="user-header-oddsformat">
                    <li><a href="#" onclick="changeOddsFormat(1); return false;"><span>EU Odds</span></a></li>
                    <li><a href="#" onclick="changeOddsFormat(2); return false;"><span>UK Odds</span></a></li>
                    <li><a href="#" onclick="changeOddsFormat(3); return false;"><span>US Odds</span></a></li>
                    <li><a href="#" onclick="changeOddsFormat(4); return false;"><span>HK Odds</span></a></li>
                    <li><a href="#" onclick="changeOddsFormat(5); return false;"><span>MA Odds</span></a></li>
                    <li><a href="#" onclick="changeOddsFormat(6); return false;"><span>IN Odds</span></a></li>

                </ul>
            </div>
            <div><label>Time:</label></div>
            <div>
                <a href="#" class="user-header-fakeselect" onclick="op.showHideTimeZone();ElementSelect.expand( 'user-header-timezone' , 'user-header-timezone-expander' , null , function(){op.hideTimeZone()} );this.blur();return false;" id="user-header-timezone-expander"><span>23 Aug 08:33, GMT +1</span></a>
            </div>


        </div>

我已尝试使用以下代码关注答案here

target = 'EU Odds'
self.driver.find_element_by_css_selector("user-header-r1 > ul").find_element_by_xpath("./li[.="+target+"]").click()

但我收到以下错误:

Exception has occurred: NoSuchElementException
Message: no such element: Unable to locate element: {"method":"css selector","selector":"user-header-r1 > ul"}

我哪里错了?

【问题讨论】:

  • user-header-r1 是一个 id,而不是 CSS 类,您正在尝试通过 CSS 选择器查找元素,该选择器不存在。尝试通过id查找
  • 谢谢。试过这个:self.driver.find_element_by_id("user-header-r1 &gt; ul").find_element_by_xpath("./li[.="+target+"]").click() 但得到了Unable to locate element: {"method":"css selector","selector":"[id="user-header-r1 &gt; ul"]"}。正如你所知道的,我对刮擦真的很陌生,所以我可能需要一些小步骤!

标签: python selenium xpath css-selectors webdriverwait


【解决方案1】:

您的元素目标具有hidden 值的属性:

...

所以我认为你需要先从另一个元素触发,然后再攻击元素目标,试试下面的代码:

#click this first
self.driver.find_element_by_css_selector('div#user-header-r1 > div > a#user-header-oddsformat-expander > span').click()

target = 'EU Odds'
self.driver.find_element_by_xpath('//ul[@id="user-header-oddsformat"]//span[text()="' +target +'"]').click()

【讨论】:

    【解决方案2】:

    展开下拉列表并使li 元素可见。 WebDriverWait 将等待所需的元素条件,在您的情况下,它是可见性。要使用 xpath 通过文本获取元素,您需要在文本中使用配额 //li[.='Some Text']

    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
    
    driver = webdriver.Chrome()
    wait = WebDriverWait(driver, 5)
    driver.get("..")
    
    target = "EU Odds"
    driver.find_element(By.ID, "user-header-oddsformat-expander").click()
    wait.until(ec.element_to_be_clickable((By.XPATH, "//li[.='" + target + "']"))).click()
    

    【讨论】:

    • 我在最后一行收到以下错误:Exception has occurred: TypeError 'str' object is not callable
    • 带有方法参数的错字。固定
    • 谢谢!最终使用它,因为我对接受的答案有疑问。在 sn-p 尝试单击之前,可单击元素未加载。
    • 很快就谈了!似乎是断断续续的 - 有时它会选择 EU Odds 有时它不会:( driver.find_element(By.ID, "user-header-oddsformat-expander").click() 肯定会选择下拉菜单。如果我单步执行 wait.until(ec.element_to_be_clickable((By.XPATH, "//li[.='" + target + "']"))).click() 那么它总是选择 EU Odds。奇怪的是我对那条线的理解是Selenium 应该等到它可以选择EU Odds
    • 管理通过在其中检查正确的元素是否已被选择或重新运行选择代码的while 循环来解决此问题。在 2-3 次尝试后总能成功,但绝对没有一致性!
    【解决方案3】:

    要选择文本为 EU Odds 的元素,您需要为element_to_be_clickable() 诱导WebDriverWait,您可以使用以下任一Locator Strategies

    • 使用CSS_SELECTOR

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "ul#user-header-oddsformat li:first-child>a[onclick^='changeOddsFormat']>span"))).click()
      
    • 使用XPATH

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//ul[@id='user-header-oddsformat']//li/a[starts-with(@onclick, 'changeOddsFormat')]/span[text()='EU Odds']"))).click()
      
    • 注意:您必须添加以下导入:

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

    【讨论】:

    • 遗憾的是,这两个都超时了:(
    【解决方案4】:

    形成 HTML 元素,您尝试选择的元素有一个名为 user-header-r1 不是 CSS 类,请尝试使用 find_element_by_id('user-header-r1') 然后如果找到该元素,则尝试在同一搜索中使用find_element_by_tag_name('ul'),如下所示:

    head_elem = self.driver.find_element_by_id("user-header-r1")
    head_elem.find_element_by_tag_name("ul")
    

    这将首先扫描 HTML 树的 ID 为 user-header-r1,这是第一个 div,然后在 div 中找到 ul 元素

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-08
      • 2014-01-22
      • 1970-01-01
      • 2016-07-28
      • 2023-03-25
      • 1970-01-01
      • 2022-11-11
      • 2011-12-13
      相关资源
      最近更新 更多