31

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

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

概括 :-

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

2 回答 2

44

切换到弹出窗口具有挑战性,至少有两个不同的原因:

  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()

请让我知道是否有人(也许是我)需要在示例中添加更多内容或提供其他信息以使其更清楚。

于 2015-03-14T18:25:48.607 回答
8

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

于 2013-07-16T12:13:55.060 回答