前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《手把手教你》系列练习篇之8-python+ selenium自动化测试 -压台篇(详细教程)

《手把手教你》系列练习篇之8-python+ selenium自动化测试 -压台篇(详细教程)

作者头像
北京-宏哥
发布2019-12-10 16:29:21
1.5K0
发布2019-12-10 16:29:21
举报
文章被收录于专栏:北京宏哥北京宏哥北京宏哥

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 Window,说明你要定位的目标元素在一个iframe里,如果要操作这个元素,首先需要从默认的Top Window,利用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()

好了,今天的练习就到这里,希望大家好好的练习和理解。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-12-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 简介
  • 2. 处理iframe切换
    • 2.1 示例一:
      • 2.2 index.html
        • 2.3 示例二:
          • 2.3.1 代码实现:
          • 2.3.2 参考代码:
          • 2.3.3 运行结果:
          • 2.3.4 浏览器运行结果:
      • 3. 处理Alert弹窗
        • 3.1 代码实现:
          • 3.2 参考代码:
            • 3.3 运行结果:
            • 4. 获取当前页面全部图片信息
              • 4.1 代码实现:
                • 4.2 参考代码:
                  • 4.3 运行结果:
                  • 5. 获取页面元素的href属性
                    • 5.1 代码实现:
                      • 5.2 参考代码:
                        • 5.3 运行结果:
                        • 6. 如何截图并保存
                          • 6.1 代码实现:
                            • 6.2 参考代码:
                              • 6.3 运行结果:
                                • 6.4 执行结果:
                                • 7. 小结
                                  • 7.1 多个iframe的切换问题
                                    • 7.2 嵌套:f1中嵌套着f2
                                      • 7.3 退出iframe:
                                      领券
                                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档