1. 简介
本文是练习篇的最后一篇文章, 虽然练习篇的文章到此就要和大家说拜拜了, 但是我们的学习之路才刚刚开始. 不要停下你的脚步, 大步朝前走吧! 比你优秀的人还在走着, 我们有什么理由停下自己的脚步了, 生命不止, 学习亦是如此. 好了, 宏哥的毒鸡汤好
喝吧, 喝够了就开始学习吧.
本文主要是练习如何处理 iframe 切换, 处理 alert 弹窗, 获取当前页面全部信息, 获取页面 href 属性和如何截图保存等等内容, 希望小伙伴或者童鞋们喜欢哈!!!
2. 处理 iframe 切换
本文介绍如何利用 Selenium 中方法, 在不同 iframe 中切换.
问题: 有时候我们发现元素定位没问题, 在测试回放的过程, 发现就是找不到元素报错.
2.1 示例一:
由于没有找到合适的 iframe 网站, 这里不好用代码举例, 简单文字加图片来介绍. 但是宏哥辗转反侧的睡不着, 最后实在是没招了. 于是自己写了一个简陋比较 low 的网页, 利用 iframe 网页框架, 把网页分成上下两个不同 iframe 控制的页面, 把下面 html 代码保存到
一个记事本, 然后修改名称为 index.HTML.
2.2 index.HTML
- <HTML>
- <head>
- <title>
- iframe test page
- </title>
- </head>
- <body>
- <iframe id="frame1" src="https://www.baidu.com" name="slider" height="325"
- width="550">
- </iframe>
- <br>
- <iframe id="frame2" src="http://example.com" name="example" height="325"
- width="550">
- </iframe>
- </body>
- </HTML>
用本地浏览器打开如下图:
用 firepath 来获得百度文本输入框的 XPath 截图
看到了红圈位置不是显示 Top Windows, 说明你要定位的目标元素在一个 iframe 里, 如果要操作这个元素, 首先需要从默认的 Top Windows, 利用 switch_to.frame('iframeid')方法来切换到具体的 iframe, 然后才能去操作目标元素.
正常百度页面, 文本输入框截图
方法介绍:
- driver.switch_to.frame("iframe1")
- # 操作目标元素, 这个目标元素在 iframe1 里面, 这里就是百度文本输入框输入文字
- driver.switch_to.default_content()
如果有具体项目页面利用了 iframe, 自己动手写一下脚本.
2.3 示例二:
宏哥最后终于找到了一个合适的 demo 来给小伙伴们或者童鞋们来用代码实际演练的例子如下:
步骤:
1. 先确认你要操作的元素, 是否存在与 iframe 中, 如果元素在 iframe 中就需要切换
2. 找到该 iframe
3. 切换到该 iframe (两种方式)
第一种方式: 有三种方法, 只是单纯的切换
- driver.switch_to.frame(1) #通过 index(下标)
- driver.switch_to.frame('login_frame_qq') #通过 name
- driver.switch_to.frame(driver.find_element_by_xpath('//iframe[@name="login_frame_qq"]')) #通过 webelement
第两种方式: 既等待元素可见又进行了 iframe 切换
WebDriverWait(driver,20).until(EC.frame_to_be_available_and_switch_to_it('login_frame_qq'))
4. 切换完后, 就以这个 iframe 中的 HTML 为主 HTML
5. 返回默认的 HTML 页面, 无论现在在那一层的 iframe, 执行一次即可.
driver.switch_to.default_content()
2.3.1 代码实现:
2.3.2 参考代码:
- # coding=utf-8
- # 1. 先设置编码, utf-8 可支持中英文, 如上, 一般放在第一行
- # 2. 注释: 包括记录创建时间, 创建人, 项目名称.
- '''
- Created on 2019-12-09
- @author: 北京 - 宏哥 QQ 交流群: 705269076
- Project: python+ selenium 自动化测试练习篇 8
- '''
- # 3. 导入模块
- import time
- from selenium import webdriver
- from selenium.webdriver.support.wait import WebDriverWait
- from selenium.webdriver.support import expected_conditions as EC
- from selenium.webdriver.common.by import By
- driver = webdriver.Chrome()
- driver.maximize_window()
- # 登录腾讯课堂页面
- driver.get('https://ke.qq.com/course/list')
- # 点击首页登录
- WebDriverWait(driver,20).until(EC.visibility_of_element_located((By.XPATH,'//a[@id="js_login"]')))
- driver.find_element_by_id("js_login").click()
- # 登录弹窗点击 QQ 登录
- WebDriverWait(driver,20).until(EC.visibility_of_element_located((By.XPATH,'//a[contains(@class,"btns-enter-qq")]')))
- driver.find_element_by_xpath('//a[contains(@class,"btns-enter-qq")]').click()
- # iframe 切换
- # driver.switch_to.frame('login_frame_qq') #通过 name
- driver.switch_to.frame(driver.find_element_by_xpath('//iframe[@name="login_frame_qq"]')) #通过 webelement
- # 弹窗点击账户密码登录 switcher_plogin
- #WebDriverWait(driver,20).until(EC.visibility_of_element_located((By.XPATH,'//a[@id="switcher_plogin"]')))
- time.sleep(10)
- driver.find_element_by_xpath('//a[@id="switcher_plogin"]').click()
2.3.3 运行结果:
运行代码后, 控制台打印如下图的结果
2.3.4 浏览器运行结果:
浏览器的运行过程, 宏哥这里就不做屏幕录制了, 这个我们看一下结果. 浏览器运行结果如下:
3. 处理 Alert 弹窗
本文来介绍如何通过 Selenium 方法去处理网页 Alert 弹窗, 和处理 iframe 类似, 都是通过 switch_to 方法. 这里还是没有找到合适的 alert 弹窗网站, 我们就自己创建一个吧, 前面文章介绍了如何通过执行 JS 来增加一个弹窗.
(1)使用 switch_to 方法先切换到浏览器弹出框
driver.switch_to.alert
(2)Alert 类提供了一系列的操作方法
dismiss(): 否
accept(): 是
text(): 获取弹出框里的文本内容
send_keys(): 在弹出框里输入文本
相关脚本代码如下:
3.1 代码实现:
3.2 参考代码:
- # coding=utf-8
- # 1. 先设置编码, utf-8 可支持中英文, 如上, 一般放在第一行
- # 2. 注释: 包括记录创建时间, 创建人, 项目名称.
- '''
- Created on 2019-12-09
- @author: 北京 - 宏哥 QQ 交流群: 705269076
- Project: python+ selenium 自动化测试练习篇 8
- '''
- # 3. 导入模块
- 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 弹窗');")
- time.sleep(2)
- driver.switch_to_alert().accept() # 点击弹出里面的确定按钮
- #driver.switch_to_alert().dismiss() # 点击弹出上面的 X 按
3.3 运行结果:
运行代码后, 控制台打印如下图的结果
注意:
driver.switch_to_alert().accept()
这是一个老方法, 在有些编辑器 (后面会介绍一款 Python 的 IDE 工具) 会提示这个方法划横线, 说明在最新 Selenium 在 Pyhton 支持包里, 这个方法被丢弃, 虽然还是可以用, 现在新的方法是 switch_to.alert(), 用这个最新方法, 我测试了下, 无法模拟点击确定和点击关
闭弹窗按钮, 所以这个地方选择了旧的方法 switch_to_alert()
4. 获取当前页面全部图片信息
本文来介绍下如何获取当前页面全部的图片信息, 图片信息可能包括, 图片名称, 图片大小等.
相关脚本代码如下:
4.1 代码实现:
4.2 参考代码:
- # coding=utf-8
- # 1. 先设置编码, utf-8 可支持中英文, 如上, 一般放在第一行
- # 2. 注释: 包括记录创建时间, 创建人, 项目名称.
- '''
- Created on 2019-12-09
- @author: 北京 - 宏哥 QQ 交流群: 705269076
- Project: python+ selenium 自动化测试练习篇 8
- '''
- # 3. 导入模块
- import time
- from selenium import webdriver
- driver = webdriver.Chrome()
- driver.maximize_window()
- driver.implicitly_wait(6)
- driver.get("http://news.baidu.com")
- time.sleep(1)
- for image in driver.find_elements_by_tag_name("img"):
- print (image.text)
- print (image.size)
- print (image.tag_name)
4.3 运行结果:
运行代码后, 控制台打印如下图的结果
运行结果:
运行结果, 发现没有图片名称打印出来, 说明百度新闻页面, 所有图片都没有给出 text 这个属性, 前端的妹子没有写图片的 text 属性. 不相信的同学或者小伙伴们可以通过 F12 查看一下图片是否有 text 这个属性.
5. 获取页面元素的 href 属性
本文来介绍如何通过 Selenium 获取页面元素的某一个属性. 一个元素可能有多个属性, 例如 class, id, name, text, href, vale 等等. 这里我们举例一个爬虫中经常需要处理的链接问题: 找出当前页面所有的超链接.
已百度首页为例, 打印所有包含 href 的元素的链接.
相关脚本代码如下:
5.1 代码实现:
5.2 参考代码:
- # coding=utf-8
- # 1. 先设置编码, utf-8 可支持中英文, 如上, 一般放在第一行
- # 2. 注释: 包括记录创建时间, 创建人, 项目名称.
- '''
- Created on 2019-12-09
- @author: 北京 - 宏哥 QQ 交流群: 705269076
- Project: python+ selenium 自动化测试练习篇 8
- '''
- # 3. 导入模块
- 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)
- for link in driver.find_elements_by_xpath("//*[@href]"):
- print (link.get_attribute('href'))
- driver.quit()
5.3 运行结果:
运行代码后, 控制台打印如下图的结果
这里只是找元素的 href 属性, 如果你需要其它属性, 例如你需要查看页面所有元素具有 id 值的话, 你可以这样写: print (link.get_attribute('id'))
6. 如何截图并保存
本文介绍如何利用 Selenium 的方法进行截图, 在测试过程中, 是有必要截图, 特别是遇到错误的时候进行截图. 在 selenium for python 中主要有三个截图方法, 我们挑选其中最常用的一种.
get_screenshot_as_file()
相关代码如下:
6.1 代码实现:
6.2 参考代码:
- # coding=utf-8
- # 1. 先设置编码, utf-8 可支持中英文, 如上, 一般放在第一行
- # 2. 注释: 包括记录创建时间, 创建人, 项目名称.
- '''
- Created on 2019-12-09
- @author: 北京 - 宏哥 QQ 交流群: 705269076
- Project: python+ selenium 自动化测试练习篇 8
- '''
- # 3. 导入模块
- 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.get_screenshot_as_file("C:\\Users\\ 你的账户名 \\Desktop\\baidu.png")
- driver.quit()
6.3 运行结果:
运行代码后, 控制台打印如下图的结果
6.4 执行结果:
会在桌面保存一张百度首页的截图, 图片后缀是 PNG. 注意路径是要两个 \\. 如下图:
7. 小结
7.1 多个 iframe 的切换问题
- # 如: 有两个 iframe:f1,f2
- # 1. 定位到 f1
- driver.switch_to_frame("f1")
- # 2. 操作元素
- # ......
- # 3. 退出 iframe
- driver.switch_to_default_content()
- # 4. 定位到 f2
- driver.switch_to_frame("f2")
- # ......
7.2 嵌套: f1 中嵌套着 f2
- driver.switch_to_frame("f1")
- driver.switch_to_frame("f2")
- # 操作元素
7.3 退出 iframe:
- # 第一种方式: 跳出所有 iframe, 回到主界面
- driver.switch_to_default_content()
- # 第二种方式: 回到 f1(返回上一级)
- driver.switch_to.parent_frame()
好了, 今天的练习就到这里, 希望大家好好的练习和理解.
您的肯定就是我进步的动力. 如果你感觉还不错, 就请鼓励一下吧! 记得点波推荐 不要忘记哦!!!
来源: https://www.cnblogs.com/du-hong/p/11982646.html