Python之Selenium
一、Selenium
Selenium是非常优秀的WEB(UI)自动化测试框架,最小的版本是Selenium4.x。Selenium支持主流的浏览器自动化测试,具体是Chrome,IE,Firefox等浏览器,Selenium也是支持主流的开发语言,如Python,Java,Net,PHP
Selenium=WebDriver+Selenium
二、环境搭建
1、安装Selenium的库,pip3 install selenium
2、安装Chrome浏览器
3、安装Chrome浏览器的驱动
A、查看Chrome浏览器版本
B、到淘宝源下载与浏览器版本匹配的Driver
C、下载成功后进行解压,并且以管理员身份执行
B、把这个driver放到Python的安装目录下
三、元素定位
webdriver之所以能够操作浏览器,是因为它首先需要定位到被操作的元素属性,然后就可以对浏览器做各种操作
1、单个元素定位
2、多个元素定位,指的是元素的属性都一致,返回的是列表,可以根据列表的索引来定位元素属性
3、不管是单个元素定位还是多个元素定位,目前有8种,分别为:
LINK_TEXT = “link text” #超链接
TAG_NAME = “tag name”
CSS_SELECTOR = “css selector”
简易操作步骤举例:
#从selenium中导入webdriver
from selenium import webdriver import time #导入时间的库 driver=webdriver.Chrome() #对Chrome进行实例化处理 driver.get("http://www.baidu.com") #导航到百度 time.sleep(4) #休眠4s driver.quit() #退出浏览器
1、ID = “id”
ID不能是唯一的
from selenium import webdriver import time # id元素属性 driver=webdriver.Chrome() driver.get("http://www.baidu.com") # send_keys()——输入的意思 driver.find_element_by_id("kw").send_keys("美食 图片") time.sleep(5) driver.quit()
2、NAME = “name”
# name的元素属性 driver=webdriver.Chrome() driver.get("http://www.baidu.com") driver.find_element_by_name("wd").send_keys("美食 图片") time.sleep(5) driver.quit()
3、CLASS_NAME = “class name”
查找class后的内容
# class_name元素属性 driver=webdriver.Chrome() driver.get("http://www.baidu.com") driver.find_element_by_class_name("s_ipt").send_keys("美食 图片") time.sleep(4) driver.quit()
4、XPATH = “xpath”
xpath和full xpath区别
当ID为动态参数时,因为每次返回的值不同建议使用full xpath全路径
当使用id,name,class_name都定位不到时,就需要考虑使用css或xpath
操作步骤
使用xpath信息时,需要点击input前的三个点,左键选择copy,可以切换xpath,full xpath和selector
# xpath元素属性 from selenium import webdriver import time driver=webdriver.Chrome() driver.get("http://www.baidu.com") driver.find_element_by_xpath('//*[@id="kw"]').send_keys('美食 图片') time.sleep(3) driver.quit()
# full xpath元素属性 driver.find_element_by_xpath('/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input').send_keys('美食 图片')
5、CSS_SELECTOR = “css selector”
css和xpath区别
css 是依据页面的数据样式定位的,有标签选择,类选择,id选择或者他们的交并集, 除此之外没有其他的辅助元素
两种定位方式功能基本一致,但是xpath明显更强大,只是xpath写起来较复杂,css写起来容易些
# css元素属性
driver=webdriver.Chrome() driver.get("http://www.baidu.com") driver.find_element_by_css_selector('#kw').send_keys("美食 图片") time.sleep(3) driver.quit()
6、
# 超链接
from selenium import webdriver import time driver=webdriver.Chrome() driver.get("http://www.baidu.com") # click()——点击的意思 driver.find_element_by_link_text('新闻').click() #partial link text driver.find_element_by_partial_link_text('新').click() time.sleep(3) driver.quit()
7、TAG_NAME = “tag name”
通过tag_name元素属性定位,tag_name获取到的是标签,当获取的标签有很多个时,就需要使用多个元素定位的方法
# tagName元素属性 driver=webdriver.Chrome() driver.get("http://www.baidu.com") # tags=driver.find_element_by_tag_name("input").send_keys("美食 图片") tags=driver.find_elements_by_tag_name("input") # print(type(tags)) # for item in tags: # print(item) tags[7].send_keys("美食 图片") time.sleep(8) driver.quit()
实战——新浪邮箱
from selenium import webdriver import time #以新浪邮箱登录为例,通过id元素属性定位: driver=webdriver.Chrome() driver.get("https://mail.sina.com.cn/") driver.find_element_by_id("freename").send_keys("9615") driver.find_element_by_id("freepassword").send_keys("123456") time.sleep(3) driver.find_element_by_link_text("登录").click()
time.sleep(3)
driver.quit()
四、UI自动化常用操作
1、获取当前测试地址
assert:是Python原生的断言方法
如:a==1,b==1,c==2
那么assert a=b,而assert a=c会出现asserterror错误
from selenium import webdriver import time
#获取当前测试地址 driver=webdriver.Chrome() driver.get("https://mail.sina.com.cn/") #current_url获取当前被测试WEB的地址 print(driver.current_url) #assert:是python原生的断言方法 assert driver.current_url.endswith("sina.com.cn/") time.sleep(3) driver.quit()
2、获取当前页面代码
from selenium import webdriver import time #获取当前页面地址 driver=webdriver.Chrome() driver.get("https://mail.sina.com.cn/") #page_source:获取当前页面的代码 print(driver.page_source) driver.quit()
3、获取当前测试WEB的title
from selenium import webdriver import time #获取WEB的title driver=webdriver.Chrome() driver.get("https://www.baidu.com/") driver.title print(driver.title) assert driver.title=="百度一下,你就知道" driver.quit()
4、页面的前进与后退
from selenium import webdriver import time #页面的前进与后退 driver=webdriver.Chrome() driver.get("https://www.baidu.com/") print(driver.current_url) time.sleep(2) driver.get("https://mail.sina.com.cn/") print(driver.current_url) time.sleep(2) #页面后退 driver.back() print(driver.current_url) time.sleep(2) #页面前进 driver.forward() print(driver.current_url) time.sleep(2) driver.title print(driver.title) driver.quit()
5、多窗口解决思路
解决步骤:
5.1、先打开当前页面
5.2、获取当前页面放在一个变量中
5.3、打开新的页面
5.4、获取所有页面并放在一个变量中
5.5、循环所有页面,判断出:如果不是当前页面,就是在新的页面
from selenium import webdriver import time driver=webdriver.Chrome() driver.get("https://mail.sina.com.cn/") #浏览器页面最大化 driver.maximize_window() # 获取当前页面放在一个变量中 # current_window_handle:获取当前页面 nowHandle=driver.current_window_handle time.sleep(3) #打开新的页面 driver.find_element_by_link_text("注册").click() time.sleep(2) #获取所有页面并且放在一个变量中 # window_handles:获取所有页面 allHandle=driver.window_handles time.sleep(1) #循环所有页面 for handle in allHandle: #判断如果不是当前页面,那么就是在新的页面 if handle!=nowHandle: #从当前页面切换到新的页面 driver.switch_to.window(handle) driver.find_element_by_name("email").send_keys("asd123") time.sleep(2) #关闭新的页面,但是不关闭程序 driver.close() #从新的页面切换到原来的页面 driver.switch_to.window(nowHandle) time.sleep(1) driver.find_element_by_id("freename").send_keys("qy12345") time.sleep(2) driver.quit()
6、清空——clear()
from selenium import webdriver import time #clear():清空 driver=webdriver.Chrome() driver.get("http://www.baidu.com") so=driver.find_element_by_id("kw") so.send_keys("美食") time.sleep(2) so.clear() time.sleep(2) driver.quit()
7、获取元素属性的值
from selenium import webdriver import time #get_attribute()的方法是获取元素属性的值 driver=webdriver.Chrome() driver.maximize_window() driver.get("http://www.baidu.com") time.sleep(2) so=driver.find_element_by_id("kw") time.sleep(1) so.send_keys("美食") #我们在输入框中输入的值都是键值中的value print(so.get_attribute("value")) time.sleep(3) driver.quit()