iTesting软件测试知识分享

Python+webdriver一劳永逸解决弹出框识别问题

自动化测试过程中的弹出框识别,应该是老生常谈的问题了,近来不断有新的读者碰见此问题并为此烦恼,干脆写一篇文章终结此类问题。

弹出框有几种类型,一般为alart, iframe, windows(包括可直接识别的div,还有不能能直接识别的),下面我们以百度首页为例,看看这几种弹出框如何识别。

假设现在要在百度首页点击登录按钮,

等如下窗口弹出来后, 点击qq图标转向qq登录

然后,页面会跳转到第3方窗口,在里面选择账户密码登录

然后在如下弹出框里输入用户名和密码

我们直接代码看下如何实现,注意,以下下代码仅仅证明可行性,未作任何优化,工程代码应该利用设计模式(PageObject)/分离元素和操作/封装重用类/定义错误处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import time
from selenium import webdriver
#打开首页,点击登录按钮
d = webdriver.Chrome()
d.get("http://www.baidu.com")
d.find_element_by_xpath(".//*[@id='u1']/a[@name='tj_login']").click()
#jquery操作页面元素,点击qq账户登录。
#1. 这是弹出框问题的终极解决办法,一律用jquey直接操作页面元素,然后通过脚本执行
js_script ='''$("#pass_phoenix_btn .phoenix-btn-item")[0].click()'''
time.sleep(2)
d.execute_script(js_script)
time.sleep(2)
#切换到qq登录页面,并打印出当前页面以验证正确性。
#2. switch_to.window允许你跟弹出页面window交互。
for handle in d.window_handles:
d.switch_to.window(handle)
time.sleep(3)
print(d.current_url)
#分析页面元素,看出最终的账户登录是个iframe,找到这个iframe的id,切入到这个iframe,继续执行操作。
#3. iframe也可以用switch_to.frame直接操作。
element = d.find_element_by_xpath(".//*[@id='combine_page']/div[1]")
d.switch_to.frame(element.find_element_by_id('ptlogin_iframe'))
d.find_element_by_xpath(".//*[@id='switcher_plogin']").click()

最后要注意, 等操作完弹出框后,应该用d.switch_to.default_content()这个方法切换回主页面继续。

欢迎关注TesterTalk,跟我共同进步。

🐶 您的支持将鼓励我继续创作 🐶
-------------评论, 吐槽, 学习交流,请关注微信公众号 iTesting-------------
请关注微信公众号 iTesting wechat
扫码关注,跟作者互动