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

Ron*_*onu 22 python selenium webdriver

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

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

摘要: -

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

Lin*_*say 40

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

  1. 许多人都知道的那个,就是你需要driver.switch_to.window(window_handle)在弹出窗口出现时同时使用它们,以便你可以在弹出窗口中找到元素,并在弹出窗口关闭后,以便你可以在主窗口中找到元素.
  2. 只有慢机器人才可能遇到的那个,就是当Selenium将一个窗口句柄作为一个变量提供时,它最初设置为None,并且在用一个值填充之前需要一点时间.

这里有一些代码可以在执行您请求的序列时解决这些问题.我正在遗漏这些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()
Run Code Online (Sandbox Code Playgroud)

如果某人(可能是我)需要在示例中添加更多内容或提供其他信息,请告诉我更清楚.

  • 您的回答挽救了我的生命!它的工作原理很吸引人,但是自Chrome 54和Chromedriver 2.25起,就无法获取扩展弹出窗口的窗口句柄。在`driver.window_handles`中只有我一个主窗口。您可能还有其他想法吗?谢谢! (2认同)
  • 当我使用 driver.window_handles 时,它只显示一个元素,同时弹出页面可用。你能帮助我吗? (2认同)

Mar*_*nds 6

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