用于处理弹出浏览器窗口的Python webdriver,它不是警报

时间:2013-07-16 12:02:40

标签: python selenium webdriver

我正在开发一个Web应用程序,其中单击某个链接会出现另一个弹出窗口。弹出窗口不是警报,而是一个表单,其中包含用户输入的各种字段,然后单击“下一步”。

如何使用selenium处理/自动化此弹出窗口。

摘要: -

  1. 点击超链接(网址) - “点击此处”
  2. 用户注册表单显示为弹出
  3. 数据由用户填写
  4. 单击下一步/提交按钮。
  5. 另一个下一个重定向到另一个页面/表单'用户个人信息页'
  6. 个人信息由用户填写
  7. 点击“下一个/提交”
  8. Popup消失了。
  9. 现在进一步处理原始/基页。

2 个答案:

答案 0 :(得分:39)

切换到弹出窗口至少有两个不同的原因:

  1. 许多人都知道的那个,就是你需要在弹出窗口时使用driver.switch_to.window(window_handle),以便你可以在弹出窗口中找到元素,并在弹出窗口关闭后,这样你就可以在主窗口中找回元素。
  2. 只有慢机器人才会遇到的那个,就是当Selenium将窗口句柄作为变量提供时,它最初设置为None,并且在它之前需要一段时间。用一个值填写。
  3. 这里有一些代码可以在执行您请求的序列时解决这些问题。我遗漏了import语句,而且我使用了我希望显而易见的变量名称。另请注意,我喜欢在我的代码中使用find_element(s)_by_xpath;随意使用其他find_element(s)_by方法:

    main_window_handle = None
    while not main_window_handle:
        main_window_handle = driver.current_window_handle
    driver.find_element_by_xpath(u'//a[text()="click here"]').click()
    signin_window_handle = None
    while not signin_window_handle:
        for handle in driver.window_handles:
            if handle != main_window_handle:
                signin_window_handle = handle
                break
    driver.switch_to.window(signin_window_handle)
    driver.find_element_by_xpath(u'//input[@id="id_1"]').send_keys(user_text_1)
    driver.find_element_by_xpath(u'//input[@value="OK"]').click()
    driver.find_element_by_xpath(u'//input[@id="id_2"]').send_keys(user_text_2)
    driver.find_element_by_xpath(u'//input[@value="OK"]').click()
    driver.switch_to.window(main_window_handle) #or driver.switch_to_default_content()
    

    如果有人(也许是我)需要在示例中添加更多信息或提供其他信息,请告知我们,以便更清楚。

答案 1 :(得分:6)

如果是新的windowiframe,您应该使用driver.switch_to_frame(webelement)driver.switch_to_window(window_name)。这应该允许您与弹出窗口中的elements进行交互。 完成后,您应该driver.switch_to_default_content()返回主网页。