【问题标题】:Tricky dropdown option selection with Python/Selenium使用 Python/Selenium 进行棘手的下拉选项选择
【发布时间】:2017-05-01 09:34:15
【问题描述】:

我正在使用 Python 和 Selenium 浏览网站。

在一个页面上,我试图通过一系列 5 个下拉框来工作。每个下拉框中的选项都是根据从上一个下拉列表中选择的内容动态生成的。

我被困在第三个下拉列表中,用户必须在其中选择一个状态。 加载后,检查的 HTML 如下所示:

<select name="state" class="pulldown"  id="state" onchange="[javablob]">
<option value="">Select a State</option>
<option value='AK_N'>               AK</option>
<option value='AL_N'>               AL</option>
<option value='AR_Y'>               AR</option>

...等等。

到目前为止我的代码是:

waitforstate = WebDriverWait(driver,30).until(EC.presence_of_element_located((By.ID,"state")))
driver.implicitly_wait(10)  #added because the ID is found but the states aren't loaded yet
state = Select(driver.find_element_by_id('state'))

但是选择我想要的状态不起作用:

state.select_by_visible_text("TN")

给...

Message: Given xpath expression ".//option[normalize-space(.) = "TN"]" is invalid: 
WrongDocumentError: Node cannot be used in a document other than the 
one in which it was created

这样做:

state.select_by_value("TN_Y")

给...

Message: Given css selector expression "option[value ="TN_Y"]" is invalid: 
TypeError: can't access dead object

没有可供选择状态的索引。

当我尝试显示加载了哪些选项时:

all_options = state.options
for option in all_options:
    print("Value is: %s" % option.get_attribute("value"))

...没有打印,甚至没有打印默认选项。但看来我可以选择和取消选择默认选项,使用这个:

state.select_by_visible_text("Select a State")
print "Select a state selected"
state._unsetSelected
print "Now it's unselected"

...运行没有错误。

我使用 Firefox 的 Selenium IDE 来导航页面,查看它是如何处理的,并且可以使用 id=state, label=TN. 选择它

我错过了什么?

【问题讨论】:

    标签: python selenium


    【解决方案1】:

    我发现 phantomjs 或其他 webkit 库在抓取 javascript 呈现的页面时更有用。完全重新创建网络浏览器交互的能力使其更可预测/更容易实现刮板。

    我个人喜欢将 selenium 和 phantomjs 一起用于抓取目的。

    phantomjs:https://realpython.com/blog/python/headless-selenium-testing-with-python-and-phantomjs/

    python-qt4: https://impythonist.wordpress.com/2015/01/06/ultimate-guide-for-scraping-javascript-rendered-web-pages/

    【讨论】:

    • 谢谢。在这种情况下,我看不到这些工具如何添加功能——我的问题不在于抓取本身,而是导航到需要填写下拉表单的抓取页面。
    • 我怀疑状态的下拉列表是用 javascript 创建的。正如我所说,使用 selenium 必须以不同的方式读取 javascript 呈现的元素。看看这篇文章:stackoverflow.com/a/22739613/5808505
    • 谢谢。在这个特定的实例中,该方法生成与我使用的方法相同的 HTML。事实证明,我的错误没有等待足够长的时间来加载完整的 javascript 生成的选项列表。 driver.implicitly_wait(10) 没有充分等待,但 sleep(5) 做到了。
    猜你喜欢
    • 2018-02-17
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    • 2019-11-11
    • 1970-01-01
    • 2020-05-15
    相关资源
    最近更新 更多