【问题标题】:Python webdriver to handle pop up browser windows which is not an alert用于处理弹出浏览器窗口的 Python webdriver 不是警报
【发布时间】:2013-07-14 14:29:51
【问题描述】:

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

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

总结:-

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

【问题讨论】:

  • 如果它不是警报,有几种不同的方式可能是弹出窗口。您能否附上网络应用的屏幕截图以及相关的 html 位?
  • 这可能是根本原因吗?绕过调用 fxdriver.modals.clearFlag_ ... cf。 *.com/questions/44568402/…

标签: python selenium webdriver


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 前段时间你的回答救了我的命!它就像一个魅力,但从 Chrome 54 和 Chromedriver 2.25 开始,没有办法获得扩展弹出窗口的窗口句柄。在driver.window_handles 中只有我的主窗口。你也许有别的想法?谢谢!
    • 更好地使用driver.switch_to_default_content() 切换回原始窗口,如@MarkRowlands 回答*.com/a/17676233/248616
    • 在我的例子中,没有为弹出窗口创建窗口句柄。我的弹出窗口是一个自定义窗口,并使用 javascript 创建。这就是没有分配给它的句柄的原因吗?
    • 当我使用 driver.window_handles 时,它只显示一个元素,而弹出页面可用。你能帮帮我吗?
    最近更新 更多