如何使用Selenium选择下拉列表?

2024-10-01 04:48:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从这个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"}

我哪里做错了


Tags: dividfalsereturnliulheaderhref
3条回答

要选择文本为EU赔率的元素,需要为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
    

展开下拉列表并使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()

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

...<ul class="user-header-fakeselect-options 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()

相关问题 更多 >