我正在尝试从网页上的下拉菜单中选择一个项目。 select
元素没有“ id”,“ class”或任何其他标识符。但是,它所在的div
类却可以。元素的结构如下所示:
<div class="dropdown_menu_one">
<i>
<select>
<option value="ALL" selected="selected">All Sports</option>
<option value="MLB">MLB</option>
<option value="NBA">NBA</option>
<option value="NFL">NFL</option>
</select>
</i>
</div>
例如,我只是想从此下拉列表中选择MLB,但是我的代码无法正常工作。我在理论上尝试从具有该选项的页面上的任何select
元素中选择选项的地方找到了该解决方案,但是它不适用于我。看起来像这样:
select_element = browser.find_element_by_xpath("//select[option[@value = '%s']]" % "MLB")
select = Select(select_element)
select.select_by_value(sports_selection)
与此相关的另一层复杂性是xpath
也在不断变化,因此我不能仅仅依靠抓取xpath
或css
选择器,因为有时它会只是在页面上根本找不到该元素。有任何想法吗?谢谢!
答案 0 :(得分:2)
有两种方法可以定位元素,甚至不具有唯一属性的元素
策略:查看周围元素,例如父元素,子元素,兄弟姐妹等,从而使其具有独特性。在您的情况下,<select>
没有任何属性,但它嵌入在具有类属性的<div>
标记下,因此您可以按以下说明使用它-
使用xpath://div[@class='dropdown_menu_one']/i/select
或//div[@class='dropdown_menu_one']//select
即使您可以根据要尝试的选项找到select。为此,您首先需要找到选项标签,然后再移至其父级,即选择。请参考://option[contains(.,'All Sports')]/parent::select
使用CSS选择器:div[class='dropdown_menu_one'] select
或.dropdown_menu_one>i>select
使用基于包含Select标记的div的标记名称:
select_container = browser.find_element_by_css_selector("div.dropdown_menu_one")
select_element = select_container.find_element_by_tag_name("select")
select = Select(select_element)
有关更多定位器策略,请参阅this document。
答案 1 :(得分:1)
像这样通过CSS选择器抓取它。使用webdriver等待将元素加载到页面上。
select_element = WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "div.dropdown_menu_one>i>select")))
select = Select(select_element)
select.select_by_value('MLB')
导入
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC