【发布时间】:2019-12-11 16:19:08
【问题描述】:
所以我一直在尝试使用 Python 中的 Selenium 在下拉菜单中选择一些值,作为列表的过滤器。我写的代码和相关的xml在下面。
…
<div id=“example_wrapper” class=“dataTables_wrapper”>
<div id=“example_filler” class=“dataTables_filter”>…</div>
<div class=“column-filter-wdigets”>
<div class=“column-filter-widget col-lg-2”>
<select class=“form-control input-sm widget-2”>
<option value>Level</option>
<option value=“1”>1</option>
<option value=“2”>2</option>
<option value=“3”>3</option>
<option value=“4”>4</option>
<option value=“5”>5</option>
<option value=“6”>6</option>
<option value=“7”>7</option>
<option value=“8”>8</option>
<option value=“9”>9</option>
</select>
....
import requests, bs4, time
from selenium import webdriver
from selenium.webdriver.support.ui import Select
print("\n\n")
browser = webdriver.Firefox()
browser.get('https://www.dnd-spells.com/spells')
selector = "div.column-filter-widget.col-lg-2"
try:
time.sleep(5)
levelList = browser.find_element_by_css_selector(selector)
print(type(levelList))
levelList.click()
levelListSelector = Select(levelList)
levelListSelector.select_by_value('3')
except:
print("First: No matches :/ \n\n")
try:
selector = "div > select"
levelOptions = browser.find_element_by_css_selector(selector)
print(levelOptions.text())
except:
print("Second: No matches :/ \n\n")
问题是,虽然第一个选择器工作正常,但我看到下拉菜单列表打开,第二个没有返回匹配项。我尝试了尽可能多的不同组合来获取选择标签,从非常具体到非常通用,但没有任何效果。它总是说找不到匹配项。
我已经走到了尽头,我决定看看如果我把它作为我做的第一个选择,我是否可以获得那个选择标签。所以我在最顶部将 selector = "div.column-filter-widget.col-lg-2" 更改为 selector = "div.column-filter-widget.col-lg-2 select" 并注释掉了第二次尝试/除了块。果然奏效了。但我不知道为什么。
有人能解释一下为什么会这样吗?我们不能从同一个 Web 驱动程序甚至一个子元素访问同一个元素两次吗?我已经到了可以继续做我想做的事情的地步,但我想在这里了解这个问题,以便我可以学习并在未来需要时更好地处理它。谢谢。
【问题讨论】:
-
文本是属性而不是函数,这就是您遇到异常的原因。试试
print(levelOptions.text)这应该可以正常工作。