执行JavaScript
前面文章介绍了ActionChains下的鼠标悬停和右键操作,其实ActionChains还有其他方法,你可以 action = ActionChains,通过这,先初始化一个ActionChains实例对象,然后在action后面输入一个点号,查看支持哪些action方法。本文开始介绍如何执行JS脚本,会用两个例子说明。
示例一,执行js脚本触发一个alert弹出框。
相关脚本代码如下:
# coding=utf-8 import time from selenium import webdriver driver = webdriver.Chrome() driver.maximize_window() driver.implicitly_wait(6) driver.get("https://www.baidu.com") time.sleep(1) driver.execute_script("window.alert('这是一个alert弹框。');") # 注意这里的分号是英文输入法的分号,不能用中文
示例二,执行js脚本来控制浏览器竖向滚动条(海量免费学习资料,软件测试交流:1140267353,还会有同行一起技术交流)
打开百度贴吧,然后拖动滚动条到左侧 “地区"
# coding=utf-8 import time from selenium import webdriver driver = webdriver.Chrome() driver.maximize_window() driver.implicitly_wait(6) driver.get("https://tieba.baidu.com/index.html") time.sleep(1) target_elem = driver.find_element_by_link_text("地区") driver.execute_script("return arguments[0].scrollIntoView();",target_elem) # 用目标元素参考去拖动 #driver.execute_script("scroll(0,2400)") # 这个是第二种方法,比较粗劣,大概的拖动
多窗口之间切换
下文来介绍如何处理driver在多窗口之间切换,想一下这样的场景,在页面A点击一个连接,会触发在新Tab或者新窗口打开页面B,由于之前的driver实例对象在页面A,但是你接下来的脚本是操作页面B的元素,这样就造成了找不到元素的报错。本来介绍selenium中switch_to.window()方法来处理这个问题。
测试场景:打开百度新闻(页面A),点击热点新闻中第一个新闻链接(一般是国家领导人的新闻),会在第二个窗口打开这个新闻的具体详情页(页面B),测试需要去判断你点击这个这个新闻,在打开的详情页是否正确。(海量免费学习资料,软件测试交流:1140267353,还会有同行一起技术交流)
问题拆分:
1. 我们已经知道switch_to.window()方法可以处理窗口切换的问题
2. 在页面A跳转到页面B之前,我们需要用一个变量保存这个新闻的标题
3. 切换到页面B后,我们获取这个新闻标题,然后和前面这个变量保存的值去对比,如果相等,那么就测试通过。
我们分两个步骤去解答这个测试需求:
1. 先实现页面A切换到页面B
2. 页面A和页面B两个新闻标题进行对比
先看看窗口切换的脚本代码:
# coding=utf-8 import time from selenium import webdriver driver = webdriver.Chrome() driver.maximize_window() driver.get('http://news.baidu.com') time.sleep(1) driver.find_element_by_xpath("//*[@id='pane-news']/div/ul/li[1]/strong/a").click() print driver.current_window_handle # 输出当前窗口句柄 handles = driver.window_handles # 获取当前全部窗口句柄集合 print handles # 输出句柄集合 for handle in handles:# 切换窗口 if handle != driver.current_window_handle: print 'switch to second window',handle driver.close() # 关闭第一个窗口 driver.switch_to.window(handle) #切换到第二个窗口
代码解释:
1. 先打印当前窗口(页面A)句柄,一个长字符串
2. 获取全部窗口句柄,这里我们有两个,打印出这两个句柄。
3. for 循环遍历,当发现其中一个句柄和当前句柄不相等,这里做了三件事,第一件,打印一个语句,告诉你马上要切换到第二个窗口,第二件,关闭当前窗口,这里指页面A,第三,切换到页面B窗口。
这里在切换到第二个页面时候,我关闭之前的页面A,只是我个人测试习惯,你可以不关闭,但是你的要思路清晰,哪些元素在页面A还是在页面B,如果操作了页面B后还要操作页面A的元素,你还要切换到页面A,为了麻烦,建议你每次切换都把前面页面给关闭。(海量免费学习资料,软件测试交流:1140267353群,还会有同行一起技术交流)
判断在打开新页面显示的新闻标题是不是你刚刚点击的新闻,脚本代码如下:
# coding=utf-8 import time from selenium import webdriver driver = webdriver.Chrome() driver.maximize_window() driver.get('http://news.baidu.com') time.sleep(1) news_link = driver.find_element_by_xpath("//*[@id='pane-news']/div/ul/li[1]/strong/a") page1_title_string = news_link.text #得到页面A新闻标题 news_link.click() # 点击新闻链接 time.sleep(1) handles = driver.window_handles for handle in handles:# 切换窗口(切换到搜狗) if handle != driver.current_window_handle: print 'switch to second window',handle driver.close() # 关闭第一个窗口 driver.switch_to.window(handle) #切换到第二个窗口 page2_title_string = driver.find_element_by_xpath("//*[@id='yc_con_txt']/p[1]").text # 详情页有一个原标题 try : assert page1_title_string in page2_title_string # 判断页面B标题是否包含页面A标题 print ('Test Pass.') except Exception as e: print ('Test Fail')
注意:很有可能遇到,页面A的标题是简短,页面B的标题是长标题,这个时候就需要采取,字符串包含的关系去断言,我这里刚好打开的详情页有一个叫 “原标题:xxxx”,由于这个新闻具有时效性,等你看这篇文章,可能脚本运行不成功,需要调整下脚本,如果不好断言,就放弃断言部分,本文只学窗口切换,至于测试断言技能,需要你不断去写脚本,去掌握和提高的部分。
上一篇 Python+Selenium练习篇之12-组合键-退格键删除文字/鼠标右键
下一篇 Python+Selenium练习篇之14-处理iframe切换/处理Alert弹窗
以上仅供参考和借鉴,希望对你有所帮助!
点个关注不迷路
小枫文章整理不易,欢迎各位朋友点赞关注