【问题标题】:Trouble handling hidden element with selenium用硒处理隐藏元素时遇到问题
【发布时间】:2017-05-23 19:08:18
【问题描述】:

每次运行此代码时,我都会遇到到达目标页面的问题。该站点需要填写发布请求参数才能到达我所在的页面。但是,使用 get request 直到它在我的代码中达到“Var4”参数是很好的。检查元素我可以看到它指示为隐藏。如果我将隐藏参数留空,那么它会重定向到另一个位置。因此,满足这件事以到达目标页面超出了我的能力。任何建议将不胜感激。

from selenium import webdriver

driver = webdriver.Chrome(r"C:\Users\ar\Desktop\Chromedriver\chromedriver.exe")
driver.get('https://www.infocomm.org/cps/rde/xchg/infocomm/hs.xsl/memberdirectory.htm')

Var1='Professional Services Providers'
Var2='AUSTRALIA'
Var3='0'
Var4='1'

driver.find_element_by_xpath('//select[@name="mas_type"]').send_keys(Var1)
driver.find_element_by_xpath('//select[@name="mas_cntr"]').send_keys(Var2)
driver.find_element_by_xpath('//input[@name="OtherCriteria"]').send_keys(Var3)
driver.find_element_by_xpath('//input[@name="DoMemberSearch"]').send_keys(Var4)
driver.find_element_by_xpath('//input[@type="submit"]').click()

应该适用于“Var4”的隐藏内容的元素:

    <form name="searchform" id="searchform" action="memberdirectory.htm" method="post" onsubmit="return Checkform();">
<input type="hidden" id="DoMemberSearch" name="DoMemberSearch" value="1">
<div class="login block-type-a block">

【问题讨论】:

  • 你能显示这个input周围的html吗?由于真正隐藏的字段不会显示在页面上,我猜该元素隐藏在您要发送密钥的实际元素中。
  • 感谢 mrfreester,您的回答。我刚刚更新了表格的部分内容。希望它能达到目的。

标签: python-3.x selenium selenium-webdriver web-scraping


【解决方案1】:

作为解决方法,您可以尝试使用 selenium 执行 javascript。

例如,取消隐藏元素

driver.execute_script("document.getElementById('DoMemberSearch').type = 'text';")

或直接设置值

driver.execute_script("document.getElementById('DoMemberSearch').value = '%s';" % Var4)

【讨论】:

  • 感谢 SergeiZ,您的回答。我需要了解您上面写的表达式。为什么这两个表达式(document.get--)和分号在表达式结束前?执行你的方法我没有发现错误,所以我想它引导我走向正确的方向。
  • 在这些表达式中,我们直接在浏览器中执行 JavaScript,以操作网页,JavaScript 中的分号用于分隔语句。
  • 在第二个表达式中,我们使用 Python 字符串格式将 Var4 的值分配给表达式中的 '%s'。更多信息在这里 - pyformat.info
  • 感谢您所做的一切,谢尔盖。
  • @SMth80 一般来说,如果您可以让您的 selenium 测试真正遵循用户路径会更好。由于 Selenium 旨在模仿典型用户,因此它没有简单的方法来操作 html。我会尽可能避免执行 javascript ,但这是完成您所要求的唯一方法。 :)
【解决方案2】:

您无法将密钥发送到隐藏元素,您可以做的是使用 javascript 发送值

大概是这样的

driver.execute_script("document.getElementById('DoMemberSearch').value='1')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2012-06-03
    • 2020-10-06
    • 1970-01-01
    相关资源
    最近更新 更多