【问题标题】:Path Selection in Selenium (Python) Not WorkingSelenium(Python)中的路径选择不起作用
【发布时间】: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) 这应该可以正常工作。

标签: python html css selenium


【解决方案1】:

文本是property 而不是function,这就是为什么你会得到exceptions。 试试这个

 try:
        selector = "div > select" 
        levelOptions = browser.find_element_by_css_selector(selector)
        print(levelOptions.text)
    except:
        print("Second: No matches :/ \n\n")

【讨论】:

  • 天哪,盯着你看的总是最简单的事情。谢谢!
【解决方案2】:

selenium.webdriver.support.ui.Select 仅在直接引用 select 类型的元素(在 html 中)时才有效。在您的示例中,您提供了一个指向 div 的元素。

请参阅 python selenium 绑定文档(特别是在 init 处):https://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.support.select

【讨论】:

  • 感谢您的链接,它很有帮助。但问题不在于 Select 构造函数,而在于使用名为 browser 的 webdriver 对象进行选择。
猜你喜欢
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多