【问题标题】:Selenium - How do I type into a text field generated by Javascript?Selenium - 如何输入由 Javascript 生成的文本字段?
【发布时间】:2016-03-09 21:07:39
【问题描述】:

在网页抓取和浏览器自动化方面我有点新意,所以非常感谢您的帮助!

我使用 Python 的 Selenium 包的目标是:

  1. 转到http://www.mcmaster.com/#orders/
  2. 使用侧面的用户名和密码登录
  3. 在快速订购功能中填写我的订单

问题是我使用以下代码为#2 的每个登录字段确定了 xpath:

def orderMcMasterParts():
    # Open each of the websites required
    mcmBrowser = webdriver.Firefox()
    mcmBrowser.get('http://www.mcmaster.com/#orders/')

    # Log in with my credentials
    usernameElem = mcmBrowser.find_element_by_xpath("//input[@class='LoginWebPartLayout_InpBx' and @type='text']")
    usernameElem.send_keys(mcmUsername)

    passwordElem = mcmBrowser.find_element_by_xpath("//input[@class='LoginWebPartLayout_InpBx' and @type='password')
    passwordElem.send_keys(mcmPassword)
    passwordElem.submit()

但我继续收到 NoSuchElementException。当我使用请求模块下载该页面上的 HTML 时,我发现这些字段都没有出现在 HTML 代码中。它们似乎以 Javascript sn-ps 的形式存在。

我的问题是如何在这些字段中进行交互和输入?

【问题讨论】:

  • 一些可能有帮助的更多信息:当我右键单击 Firefox 中的用户名字段并选择“检查元素”时,我会得到带有类“csstransitions gr__mcmaster_com”的 HTML 但是如果我右键单击页面并选择“查看页面源代码”,我得到以 class="" 开头的 HTML。
  • javascript代码是否自动执行?如果没有,那么你应该触发它执行,等待几秒钟,然后尝试获取输入。
  • 检查this answer,它会告诉你如何等待某个元素可用。

标签: javascript python selenium selenium-webdriver


【解决方案1】:

如果页面上没有元素,则会出现此问题。原因之一可能是您需要等到元素被加载。您至少有 2 个选项:显式 WebDriver 等待和隐式 WebDriver 等待。

如果我们在谈论具体的例子:http://www.mcmaster.com/#orders/

我想到了两件事(经过快速调试):

  • 此“登录”表单在 iframe 内:在访问 iframe 内的元素之前,您需要通过 Selenium 切换到 iframe
在 [17] 中:driver.switch_to.frame? 类型:实例方法 文件:/usr/local/lib/python2.7/site-packages/selenium/webdriver/remote/switch_to.py 定义:driver.switch_to.frame(self, frame_reference) 文档字符串: 按索引、名称或 web 元素将焦点切换到指定的框架。 :args: - frame_reference:要切换到的窗口的名称,一个表示索引的整数, 或作为 (i) 框架切换到的 web 元素。 :用法: driver.switch_to.frame('frame_name') driver.switch_to.frame(1) driver.switch_to.frame(driver.find_elements_by_tag_name(“iframe”)[0])
  • 确保在输入内容之前选择了正确的 Web 元素;网页元素应该可见

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 2011-02-24
    • 2016-06-10
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    相关资源
    最近更新 更多