Pythion的Selenium自动化测试(二)常用Webdriver API(下)

申明:资料来源于网络及书本,通过理解、实践、整理成学习笔记。

多表单切换

在 Web应用中经常会遇到frame/iframe表单嵌套页面的应用,WebDriver 只能在一个页面上对元素识别与定位,对于 frame/iframe表单内嵌页面上的元素无法直接定位。这时就需要通过switch_to.frame()方法将当前定位的主体切换为frame/iframe表单的内嵌页面中。
在这里插入图片描述
QQ邮箱中的登录界面需要切换表单,下面是QQ邮箱中的登录界面截取的一段html代码

<iframe id="login_frame" name="login_frame" height="100%" scrolling="no" width="100%" 
frameborder="0" test="jostinsu1" src="https://xui.ptlogin2.qq.com/cgi-bin/xlogin?
target=self&amp;appid=522005705&amp;daid=4&amp;s_url=https://mail.qq.com/cgi-
bin/readtemplate?
check=false%26t=loginpage_new_jump%26vt=passport%26vm=wpt%26ft=loginpage%26target=&amp;st
yle=25&amp;low_login=1&amp;proxy_url=https://mail.qq.com/proxy.html&amp;need_qr=0&amp;hid
e_border=1&amp;border_radius=0&amp;self_regurl=http://zc.qq.com/chs/index.html?
type=1&amp;app_id=11005?
t=regist&amp;pt_feedback_link=http://support.qq.com/discuss/350_1.shtml&amp;css=https://r
es.mail.qq.com/zh_CN/htmledition/style/ptlogin_input_for_xmail51328e.css"></iframe>

实现点击QQ邮箱登录界面中的账号密码登录按钮

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://mail.qq.com/")

# 定位login_frame
driver.switch_to.frame("login_frame")

# 点击QQ邮箱登录界面中的账号密码登录按钮
driver.find_element_by_css_selector("#switcher_plogin").click()

switch_to.frame():默认可以直接取表单的id或name属性。如果 iframe没有可用的id和name属性,则可以通过xpath的方式进行定位。

# 定位login_frame
xp = driver.find_element_by_xpath("//*[@id=\"login_frame\"]")
driver.switch_to.frame(xp)

多窗口切换

在页面操作过程中有时候点击某个链接会弹出新的窗口,这时就需要主机切换到新打开的窗口上进行操作。WebDriver提供了switch_to.window()方法,可以实现在不同的窗口之间切换。

from selenium import webdriver

driver = webdriver.Chrome()
# 窗口全屏
driver.maximize_window()
print('===网页全屏成功===')
# 打开百度页面
driver.get("https://www.baidu.com/")
print("===打开百度页面成功===")
# 获取百度窗口句柄
baidu_handle = driver.current_window_handle
print('===获取百度窗口句柄成功===')
# 打开搜狗页面
js = "window.open('{}','_blank');"
driver.execute_script(js.format('https://www.sogou.com/'))
print('===打开搜狗页面成功===')
# 获取当前所有打开的窗口句柄
current_all_handles = driver.window_handles
print('===获取当前所有打开的窗口句柄成功===')
# 进入搜狗页面搜索周星驰
for handle in current_all_handles:
    if handle != baidu_handle:
        driver.switch_to.window(handle)
        print('===进入搜狗页面成功===')
        driver.find_element_by_id('query').send_keys('周星驰')
        driver.find_element_by_id('stb').click()
        print('===搜狗浏览器搜索周星驰成功===')
# 进入百度页面搜索周星驰
for handle in current_all_handles:
    if handle == baidu_handle:
        driver.switch_to.window(handle)
        print('===进入百度页面成功===')
        driver.find_element_by_id('kw').send_keys('周星驰')
        driver.find_element_by_id('su').click()
        print('===百度浏览器搜索周星驰成功===')
driver.quit()
        
执行结果:
===网页全屏成功===
===打开百度页面成功===
===获取百度窗口句柄成功===
===打开搜狗页面成功===
===获取当前所有打开的窗口句柄成功===
===进入搜狗页面成功===
===搜狗浏览器搜索周星驰成功===
===进入百度页面成功===
===百度浏览器搜索周星驰成功===

警告框处理

在 WebDriver中处理JavaScript所生成的alert、confirm 以及 prompt十分简单,具体做法是使用switch_to_alert()方法定位到alert/confirm/prompt,然后使用text/acceptldismiss/send_keys等方法进行操作。

  • text:返回alcrt/confirm/prompt中的文字信息。
  • accept0:接受现有警告框。
  • dismiss():解散现有警告框。
  • send_keys(keysToSend):发送文本至警告框。keysToSend:将文本发送至警告框。
from selenium import webdriver
from selenium.webdriver import ActionChains

driver = webdriver.Chrome()
# 窗口全屏
driver.maximize_window()
print('===网页全屏成功===')
# 打开百度页面
driver.get("https://www.baidu.com/")
print("===打开百度页面成功===")
# 鼠标悬浮设置按钮
baidu_set_btn = driver.find_element_by_id('s-usersetting-top')
print('===鼠标悬浮设置按钮成功===')
# 点击搜索设置按钮
ActionChains(driver).move_to_element(baidu_set_btn).perform()
driver.find_element_by_css_selector('#s-user-setting-menu > div > a.setpref').click()
print('===点击搜索设置按钮成功===')
# 隐式等待
driver.implicitly_wait(2)
# 点击保存设置
driver.find_element_by_link_text('保存设置').click()
print('===点击保存设置成功===')
# 接受警告框
driver.switch_to.alert.accept()
print('===接受警告框成功===')
driver.quit()

执行结果:
===网页全屏成功===
===打开百度页面成功===
===鼠标悬浮设置按钮成功===
===点击搜索设置按钮成功===
===点击保存设置成功===
===接受警告框成功===

操作Cookie

有时候我们需要验证浏览器中cookie是否正确,因为基于真实cookie的测试是无法通过白盒和集成测试的。WebDriver 提供了操作Cookie的相关方法,可以读取、添加和删除Cookie信息。

  • get_cookies():获得所有cookie信息。
  • get_cookeie(name):返回字典的key为"name"的cookie信息。
  • add_cookie(cookie_dict):添加cookie。"cookie_dict"指字典对象,必须有name和value值。
  • delete_cookie(name,optionsString):删除cookie信息。"name"是要删除的名称,“options"是该cookie的选项,目前支持的选项包括"路径”,“域”。
  • delete_all_cookies():删除所有cookie信息。
from selenium import webdriver

driver = webdriver.Chrome()
# 窗口全屏
driver.maximize_window()
print('===网页全屏成功===')
# 打开百度页面
driver.get("https://www.baidu.com/")
print("===打开百度页面成功===")
# 获得cookie信息
cookies = driver.get_cookies()
print('===获取cookie信息成功===')
# 打印cookie信息
print(cookies)
# 退出
driver.quit()

执行结果:
===网页全屏成功===
===打开百度页面成功===
===获取cookie信息成功===
[{'domain': '.baidu.com', 'expiry': 1618198754, 'httpOnly': False, 'name': 'BA_HECTOR', 'path': '/', 'secure': False, 'value': 'ad048h81a100844hr61g77cmj0q'}, {'domain': '.baidu.com', 'httpOnly': False, 'name': 'H_PS_PSSID', 'path': '/', 'secure': False, 'value': '33797_33744_33344_31254_33756_33676_33713_26350'}, {'domain': '.baidu.com', 'expiry': 1649731154, 'httpOnly': False, 'name': 'BAIDUID', 'path': '/', 'secure': False, 'value': '58646E841C06BDE817983C5BC892666C:FG=1'}, {'domain': 'www.baidu.com', 'httpOnly': False, 'name': 'BD_HOME', 'path': '/', 'secure': False, 'value': '1'}, {'domain': '.baidu.com', 'expiry': 3765678801, 'httpOnly': False, 'name': 'PSTM', 'path': '/', 'secure': False, 'value': '1618195156'}, {'domain': 'www.baidu.com', 'expiry': 1619059154, 'httpOnly': False, 'name': 'BD_UPN', 'path': '/', 'secure': False, 'value': '12314353'}, {'domain': '.baidu.com', 'expiry': 3765678801, 'httpOnly': False, 'name': 'BIDUPSID', 'path': '/', 'secure': False, 'value': '58646E841C06BDE885B38330A8CFBD88'}]

cookie数据是以字典的形式存放的,也可以向浏览器中写入cookie信息。

from selenium import webdriver

driver = webdriver.Chrome()
# 窗口全屏
driver.maximize_window()
print('===网页全屏成功===')
# 打开百度页面
driver.get("https://www.baidu.com/")
print("===打开百度页面成功===")
# 向cookie的name和value中添加会话信息
driver.add_cookie({'name':'键','value':'值'})
print('添加新的cookie')
# 遍历cookies中的name和value信息并打印
for cookie in driver.get_cookies():
    print('{} -> {}'.format(cookie['name'],cookie['value']))
print('===打印cookies成功===')
# 退出
driver.quit()

执行结果:
===网页全屏成功===
===打开百度页面成功===
添加新的cookie
键 -> 值
BA_HECTOR -> at0k8la484a50hel021g77dtr0q
BAIDUID_BFESS -> 10A108BBA236766424246CBC1382D8EA:FG=1
H_PS_PSSID -> 33798_33242_33750_33272_31253_33689_33759_33855_33713_26350
BAIDUID -> 10A108BBA236766424246CBC1382D8EA:FG=1
BD_HOME -> 1
PSTM -> 1618196413
BD_UPN -> 12314353
BIDUPSID -> 10A108BBA236766401B20DF51B1BA163
===打印cookies成功===

调用JavaScript

虽然WebDriver提供了操作浏览器的前进和后退方法,但对于浏览器滚动条并没有提供相应的操作方法。在这种情况下,就可以借助JavaScript 来控制浏览器的滚动条。WebDriver提供了execute_ script)方 法来执行JavaScript代码。

# 调整浏览器滚动条位置的JavaScript代码
windows.scrollTo(左边距,上边距)
from selenium import webdriver

driver = webdriver.Chrome()
# 窗口全屏
driver.maximize_window()
print('===网页全屏成功===')
# 打开百度页面
driver.get("https://www.baidu.com/")
print("===打开百度页面成功===")
# 百度搜索
driver.find_element_by_id('kw').send_keys('周星驰')
driver.find_element_by_id('su').click()
driver.implicitly_wait(2)
print('===百度搜索周星驰成功===')
# 通过JavaScript设置浏览器窗口的滚动条位置
js = 'window.scrollTo(100,450);'
driver.execute_script(js)
print('===窗口滚动成功===')
# 退出
driver.quit()

执行结果:
===网页全屏成功===
===打开百度页面成功===
===百度搜索周星驰成功===
===窗口滚动成功===

处理HTML5的视频播放

大多数浏览器使用控件(如Flash)来播放视频,但是,不同的浏览器需要使用不同的插件。HTMLS定义了一个新的元素,指定了一个标准的方式来嵌入电影片段。

from selenium import webdriver

driver = webdriver.Chrome()
# 窗口全屏
driver.maximize_window()
print('===网页全屏成功===')
# 打开百度页面
driver.get("https://videojs.com/forest")
print("===打开页面成功===")
# 通过JavaScript控制视频的播放
video = driver.find_element_by_css_selector('#vjs_video_3_html5_api')
driver.execute_script('return arguments[0].play()', video)
print('===播放视频成功===')
# 暂停视频
driver.execute_script('arguments[0].pause()', video)
# 退出
driver.quit()

窗口截图

WebDriver提供了截图函数get_ screenshot_ as_ file()来截取当前窗口。函数的参数是保存的截图保存的路径。

from selenium import webdriver
import time
driver = webdriver.Chrome()
# 窗口全屏
driver.maximize_window()
print('===网页全屏成功===')
# 打开百度页面
driver.get("https://www.baidu.com/")
print("===打开百度页面成功===")
# 百度搜索
driver.find_element_by_id('kw').send_keys('周星驰')
driver.find_element_by_id('su').click()
print('===搜索周星驰成功===')
driver.get_screenshot_as_file('D:/自动化截图/{}.png'.format(time.time()))
print('===截图成功===')
# 退出
driver.quit()

执行结果;
===网页全屏成功===
===打开百度页面成功===
===搜索周星驰成功===
===截图成功===

关闭窗口

  • 退出驱动程序:quit()
  • 关闭当前窗口:close()

WebDriver原理

Server端就是Remote Server,可以是任意的浏览器。当我们的脚本启动浏览器后,该浏览器就是ReroteServer,它的职责就是等待Client发送请求并做出响应。
Client端简单说来就是我们的测试代码。我们测试代码中的- - 些行为,例如打开浏览器,转跳到特定的URL等操作是以http请求的方式发送给被测试浏览器的,也就是Remote Server。Remote Server接受请求,执行相应操作,并在Response中返回执行状态、返回值等信息。
WebDriver的工作流程:

  • WebDriver 启动目标浏览器,并绑定到指定端口。启动的浏览器实例将作为WebDriver的Remote Server。
  • Client 端通过CommandExcuter发送HTTPRequest给Remote Server 的侦听端口(通信协议: the webriver wire protocol )。
  • Remote Server 需要依赖原生的浏览器组件(如IEDriverServer.exe、chromedriver.exe)来转化浏览器的native调用。

Python提供了logging 模块给运行中的应用提供了一个标准的信息输出接口。它提供了basicConfig0方法用于基本信息的定义。开启debug 模块,就可以捕捉到客户端向服务器发送的请求。

一个坚持学习,坚持成长,坚持分享的人,即使再不聪明,也一定会成为优秀的人!

如果看完觉得有所收获的话,记得一键三连哦,谢谢大家!

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拿头来坚持

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值