从“选择”中选择没有ID,名称或XPATH的下拉菜单项?

时间:2020-10-07 05:37:00

标签: python-3.x selenium

我正在尝试从网页上的下拉菜单中选择一个项目。 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也在不断变化,因此我不能仅仅依靠抓取xpathcss选择器,因为有时它会只是在页面上根本找不到该元素。有任何想法吗?谢谢!

2 个答案:

答案 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