如何解决如何使用Selenium选择下拉菜单?
我正在尝试从此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"}
我要去哪里错了?
解决方法
展开下拉菜单,使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
:
...
因此,我认为在攻击元素目标之前,您首先需要从另一个元素触发,请尝试以下代码:
#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()
,
要选择文本为 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
形成HTML元素,您要选择的元素的ID为
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
),然后在ul
内找到div
元素
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。