Selenium - 如何输入Javascript生成的文本字段?

时间:2015-12-04 20:15:46

标签: javascript python selenium selenium-webdriver

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

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

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

    问题是我使用以下代码为#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。当我使用requests模块下载该页面上的HTML时,我发现HTML代码中没有出现这些字段。它们似乎以Javascript片段形式存在。

    我的问题是我如何互动并输入这些字段?

1 个答案:

答案 0 :(得分:0)

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

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

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

  • 此“登录”表单位于iframe内:在访问iframe中的元素之前,您需要通过Selenium切换到iframe
In [17]: driver.switch_to.frame?
Type:        instancemethod
File:        /usr/local/lib/python2.7/site-packages/selenium/webdriver/remote/switch_to.py
Definition:  driver.switch_to.frame(self, frame_reference)
Docstring:
Switches focus to the specified frame, by index, name, or webelement.

:Args:
 - frame_reference: The name of the window to switch to, an integer representing the index,
                    or a webelement that is an (i)frame to switch to.

:Usage:
    driver.switch_to.frame('frame_name')
    driver.switch_to.frame(1)
    driver.switch_to.frame(driver.find_elements_by_tag_name("iframe")[0])
  • 确保在输入内容之前选择了正确的网页元素;网页元素应可见