2013-07-16 41 views
13

我正在一个web应用程序,其中点击一些链接出现另一个弹出窗口。弹出窗口不是一个警报,但它是一个窗体,其中包含用户输入的各种字段,然后单击“下一步”。Python的webdriver来处理弹出不是一个警报的浏览器窗口

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

总结: -

  1. 点击超级链接(URL) - “点击这里”
  2. 用户登记表格显示为弹出
  3. 的数据是由用户
  4. 填充
  5. 单击下一步/提交按钮。
  6. 旁边另一重定向到另一个网页/表单“用户个人信息页
  7. 个人信息是由用户填写
  8. 点击“下一步/提交”
  9. 弹出消失。
  10. 现在进一步处理原始/基本页面。
+0

如果它不是一个警报,有几种不同的方式,它可能是一个弹出窗口。你可以包括网页应用程序的屏幕截图,以及相关的html位? –

+0

这可能是根本原因吗?绕过调用fxdriver.modals.clearFlag_ ... cf. https://stackoverflow.com/questions/44568402/how-do-i-manually-mouse-dismiss-a-javascript-alert-and-get-back-the-the-body-o/44592827#44592827 – NevilleDNZ

回答

3

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

25

切换到弹出的是具有挑战性的至少两个单独的原因:

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

请让我知道,如果有人(或许我)需要添加更多的例子,或提供其他信息,以使其更清晰。

+1

您的答案前段时间挽救了我的生命!它的功能就像一个魅力,但由于Chrome 54和Chromedriver 2.25,没有办法获得扩展弹出窗口句柄。在'司机。window_handles'只有我的主窗口。你可能有其他想法吗?谢谢! – monami

+1

在@MarkRowlands中使用'driver.switch_to_default_content()'更好地切换回原始窗口answer https://stackoverflow.com/a/17676233/248616 –

相关问题