一、 元素的定位
web⾃动化测试的操作核⼼是能够找到⻚⾯对应的元素,然后才能对元素进⾏具体的操作。常⻅的元素定位⽅式⾮常多,如id,classname,tagname,xpath,cssSelector。常⽤的主要由cssSelector和xpath。
1.1、查找一个元素:find_element
查找一个元素,我们这里以查找迪丽热巴为例。
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
#1、打开浏览器——驱动管理
ChromeIns=ChromeDriverManager().install()
##2、创建谷歌浏览器驱动对象
driver=webdriver.Chrome(service=Service(ChromeIns))
time.sleep(2)
##3、输入百度网址
driver.get("https://www.baidu.com/")
time.sleep(2)
##4、找到百度输入框,输入关键词“迪丽热巴”
driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("迪丽热巴")
##5、点击“百度一下”按钮
driver.find_element(By.CSS_SELECTOR,"#su").click()
time.sleep(2)
##6.关闭浏览器
driver.quit()
测试一
1.1、查找多个元素:find_elements()
将百度首页的所有热依次输出,满足查找多个元素的要求
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
##查找多个元素
# #1、打开浏览器——驱动管理
ChromeIns=ChromeDriverManager().install()
# ##2、创建谷歌浏览器驱动对象
driver=webdriver.Chrome(service=Service(ChromeIns))
time.sleep(2)
##到百度首页
driver.get("https://www.baidu.com/")
##查找热搜
ret=driver.find_elements(By.CSS_SELECTOR,"#hotsearch-content-wrapper > li")
for i in ret:
print(i.text)#获取每个元素的文本信息
driver.quit()
查找结果输出:
二、操作测试对象
2.1、点击百度一下按钮
#查找元素+点击对象
# # #1、打开浏览器——驱动管理
ChromeIns=ChromeDriverManager().install()
# # ##2、创建谷歌浏览器驱动对象
driver=webdriver.Chrome(service=Service(ChromeIns))
time.sleep(2)
# ##到百度首页
driver.get("https://www.baidu.com/")
## 点击“百度一下”按钮
driver.find_element(By.CSS_SELECTOR,"#su").click()
2.2、点击百度首页的新闻
import time
from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
#查找元素+点击对象
# # #1、打开浏览器——驱动管理
ChromeIns=ChromeDriverManager().install()
# # ##2、创建谷歌浏览器驱动对象
driver=webdriver.Chrome(service=Service(ChromeIns))
time.sleep(2)
# ##到百度首页
driver.get("https://www.baidu.com/")
## 点击“百度一下”按钮
driver.find_element(By.CSS_SELECTOR,"#hotsearch-content-wrapper > li:nth-child(6) > a").click()
time.sleep(3)
2.3、模拟按键输入
模拟输入“俄乌战争”,并且点击百度一下按钮
#查找元素+点击对象
# # #1、打开浏览器——驱动管理
ChromeIns=ChromeDriverManager().install()
# # ##2、创建谷歌浏览器驱动对象
driver=webdriver.Chrome(service=Service(ChromeIns))
time.sleep(2)
# ##到百度首页
driver.get("https://www.baidu.com/")
## 文本框输入
driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("俄乌战争")
driver.find_element(By.CSS_SELECTOR,"#su").click()
time.sleep(3)
driver.quit()
2.4、清除文本内容
假如我们在输入俄乌战争之后,想重新搜索美国,我们按如下方式操作
## 清除文本内容
# # #1、打开浏览器——驱动管理
ChromeIns=ChromeDriverManager().install()
# # ##2、创建谷歌浏览器驱动对象
driver=webdriver.Chrome(service=Service(ChromeIns))
time.sleep(2)
# ##到百度首页
driver.get("https://www.baidu.com/")
## 文本框输入
driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("俄乌战争")
time.sleep(3)
driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("美国")
driver.find_element(By.CSS_SELECTOR,"#su").click()
time.sleep(3)
driver.quit()
可是我们想要的结果,并不是这样,因为连续的send_keys会将搜索的内容拼接到一起,所以我们就需要用到清除函数。
## 清除文本内容
# # #1、打开浏览器——驱动管理
ChromeIns=ChromeDriverManager().install()
# # ##2、创建谷歌浏览器驱动对象
driver=webdriver.Chrome(service=Service(ChromeIns))
time.sleep(2)
# ##到百度首页
driver.get("https://www.baidu.com/")
## 文本框输入
driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("俄乌战争")
time.sleep(2)
#清除一下,重新进行搜索
driver.find_element(By.CSS_SELECTOR,"kw").clear()
time.sleep(2)
driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("美国")
time.sleep(2)
driver.quit()
2.5、获取文本信息
#获取文本信息
# # #1、打开浏览器——驱动管理
ChromeIns=ChromeDriverManager().install()
# # # ##2、创建谷歌浏览器驱动对象
driver=webdriver.Chrome(service=Service(ChromeIns))
time.sleep(3)
# # ##到百度首页
driver.get("https://www.baidu.com/")
text=driver.find_element(By.CSS_SELECTOR,"#hotsearch-content-wrapper > li:nth-child(2) > a").text
print(text)
driver.quit()
通常在获取文本信息之后我们会判断所获取的信息是否正确
#获取文本信息
# # #1、打开浏览器——驱动管理
ChromeIns=ChromeDriverManager().install()
# # # ##2、创建谷歌浏览器驱动对象
driver=webdriver.Chrome(service=Service(ChromeIns))
time.sleep(3)
# # ##到百度首页
driver.get("https://www.baidu.com/")
text=driver.find_element(By.CSS_SELECTOR,"#hotsearch-content-wrapper > li:nth-child(2) > a").text
print(text)
assert text=="5在基辅街头感受乌克兰民众的愤懑"
driver.quit()
注意:如果我们在这里需要获取到百度一下按钮上的文字,通过上述方法是获取不到的。我们需要通过以下方法来获取。
#获取百度一下按钮上的文字
# # #1、打开浏览器——驱动管理
ChromeIns=ChromeDriverManager().install()
# # # ##2、创建谷歌浏览器驱动对象
driver=webdriver.Chrome(service=Service(ChromeIns))
time.sleep(3)
# # ##到百度首页
driver.get("https://www.baidu.com/")
text=driver.find_element(By.CSS_SELECTOR,"#su").get_attribute("value")
print(text)
2.6、打印当前页面的标题和URL
#获取页面标题和URL
# # # #1、打开浏览器——驱动管理
ChromeIns=ChromeDriverManager().install()
# # # # ##2、创建谷歌浏览器驱动对象
driver=webdriver.Chrome(service=Service(ChromeIns))
time.sleep(3)
# # # ##到百度首页
driver.get("https://www.baidu.com/")
title=driver.title
url=driver.current_url
print(title)
print(url)
适用情况为当前页面元素可点击跳转的情况下,用来检测跳转的结果是否是正确的
三、窗口
当我们⼿⼯测试的时候,我们可以通过眼睛来判断当前的窗⼝是什么,但对于程序来说它是不知道当
前最新的窗⼝应该是哪⼀个。对于程序来说它怎么来识别每⼀个窗⼝呢?每个浏览器窗⼝都有⼀个唯
⼀的属性句柄(handle)来表⽰,我们就可以通过句柄来切换。
3.1、点击页面某一按钮发生跳转
#获取页面标题和URL
# # # # #1、打开浏览器——驱动管理
ChromeIns=ChromeDriverManager().install()
# # # # # ##2、创建谷歌浏览器驱动对象
driver=webdriver.Chrome(service=Service(ChromeIns))
time.sleep(3)
# # # # ##到百度首页
driver.get("https://www.baidu.com/")
title=driver.title
url=driver.current_url
print("before:"+title)
print("before:"+url)
driver.find_element(By.CSS_SELECTOR,"#s-top-left > a:nth-child(6)").click()
#获取当前页面的句柄——第一个标签页
curhandle=driver.current_window_handle
#获取所有的句柄
allhandle=driver.window_handles
#遍历所有的句柄,切换到新的页面
for handle in allhandle:
if handle!=curhandle:
#切换句柄
driver.switch_to.window(handle)
#测试跳转的结果
time.sleep(3)
print("after:"+driver.title)
print("after:"+driver.current_url)
driver.quit()
运行结果:
3.2、点击页面某一按钮未发生跳转
#获取页面标题和URL
# # # # #1、打开浏览器——驱动管理
ChromeIns=ChromeDriverManager().install()
# # # # # ##2、创建谷歌浏览器驱动对象
driver=webdriver.Chrome(service=Service(ChromeIns))
time.sleep(3)
# # # # ##到百度首页
driver.get("https://image.baidu.com/")
title=driver.title
url=driver.current_url
print("before:"+title)
print("before:"+url)
driver.find_element(By.CSS_SELECTOR,"#app > div > div.scroll-container_3GMO1.cos-flex.cos-flex-1.scroll-wrapper_BN2t5 > div > div.cos-flex.cos-flex-col.index-wrapper_B1TLY > div:nth-child(3) > div:nth-child(2) > div > div:nth-child(4) > a:nth-child(1) > div > div._image_bo7t2_1._image_bo7t2_1.sc-image._image_bo7t2_1._hover-style_bo7t2_108._ratio-image_bo7t2_88.item-img_2t5ev > img")
print("after:"+title)
print("after:"+url)
3.3 、窗口设置大小
窗口设置大小分为四种情况,分别是最大化,最小化,铺满全屏和手工设置。
#窗口大小的设置
# #1、打开浏览器——驱动管理
ChromeIns=ChromeDriverManager().install()
##2、创建谷歌浏览器驱动对象
driver=webdriver.Chrome(service=Service(ChromeIns))
# time.sleep(3)
##到百度首页
driver.get("https://www.baidu.com/")
#窗口最大化
driver.maximize_window()
time.sleep(2)
#窗口最小化
driver.minimize_window()
time.sleep(2)
#窗口铺满全屏
driver.fullscreen_window()
time.sleep(2)
#窗口自己调节
driver.set_window_size(1024,800)
time.sleep(2)
driver.quit()
3.4、屏幕截图
我们的⾃动化脚本⼀般部署在机器上⾃动的去运⾏,如果出现了报错,我们是不知道的,可以通过抓
拍来记录当时的错误场景
#进阶版本:每次生成的图片文件都不一样
#百度首页
#autotest-2024-05-08-104723.png
filename="autotest-"+datetime.datetime.now().strftime("%Y-%m-%d-%H%M%S")+".png"
# #./image/sautotest-2024-05-08-104723.png
driver.save_screenshot("./images/"+filename)
四、弹窗
4.1、警告弹窗
#确认弹窗
# #1、打开浏览器——驱动管理
ChromeIns=ChromeDriverManager().install()
# ##2、创建谷歌浏览器驱动对象
driver=webdriver.Chrome(service=Service(ChromeIns))
time.sleep(2)
# ##3、输入网址
driver.get("file:///C:/Users/LYQ/Desktop/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E8%AF%BE%E4%BB%B6/selenium-html/alert.html")
driver.find_element(By.CSS_SELECTOR,"#tooltip").click()
time.sleep(2)
#切换到弹窗以及关闭弹窗
alert=driver.switch_to.alert
alert.accept()
driver.quit()
4.2、确认弹窗
4.2.1、点击确认
##弹窗
#确认弹窗
# #1、打开浏览器——驱动管理
ChromeIns=ChromeDriverManager().install()
# ##2、创建谷歌浏览器驱动对象
driver=webdriver.Chrome(service=Service(ChromeIns))
time.sleep(2)
# ##3、输入网址
driver.get("file:///C:/Users/LYQ/Desktop/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E8%AF%BE%E4%BB%B6/selenium-html/confirm.html")
driver.find_element(By.CSS_SELECTOR,"body > input[type=button]").click()
time.sleep(2)
#切换到弹窗以及关闭弹窗
alert=driver.switch_to.alert
alert.accept()
time.sleep(2)
driver.quit()
4.2.2、点击取消
##弹窗
#确认弹窗
# #1、打开浏览器——驱动管理
ChromeIns=ChromeDriverManager().install()
# ##2、创建谷歌浏览器驱动对象
driver=webdriver.Chrome(service=Service(ChromeIns))
time.sleep(2)
# ##3、输入网址
driver.get("file:///C:/Users/LYQ/Desktop/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E8%AF%BE%E4%BB%B6/selenium-html/confirm.html")
driver.find_element(By.CSS_SELECTOR,"body > input[type=button]").click()
time.sleep(2)
#切换到弹窗以及关闭弹窗
alert=driver.switch_to.alert
alert.dismiss()
time.sleep(2)
driver.quit()
4.3、提示弹窗
# #1、打开浏览器——驱动管理
ChromeIns=ChromeDriverManager().install()
# ##2、创建谷歌浏览器驱动对象
driver=webdriver.Chrome(service=Service(ChromeIns))
time.sleep(2)
# ##3、输入网址
driver.get("file:///C:/Users/LYQ/Desktop/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E8%AF%BE%E4%BB%B6/selenium-html/Prompt.html")
driver.find_element(By.CSS_SELECTOR,"body > input[type=button]").click()
time.sleep(2)
#切换到弹窗以及关闭弹窗
alert=driver.switch_to.alert
alert.send_keys("LYQ")
alert.accept()
time.sleep(2)
driver.quit()
五、等待
5.1、强制等待
#强制等待
# #1、打开浏览器——驱动管理
ChromeIns=ChromeDriverManager().install()
# ##2、创建谷歌浏览器驱动对象
driver=webdriver.Chrome(service=Service(ChromeIns))
time.sleep(2)
# ##3、输入网址
driver.get("https://www.baidu.com/")
driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("迪丽热巴")
driver.find_element(By.CSS_SELECTOR,"#su").click()
time.sleep(3)
driver.find_element(By.CSS_SELECTOR,"#\\31 > div > div > div > div > div > div.new-tag_4ozgi.new-text-link_3k9GD > div > div.baike-slink-wrapper_7k8vl.cu-pb-xs-lg > div > div:nth-child(1) > a > button > div")
driver.quit()
优点:使用简单,调试的时候⽐较有效
缺点:影响运行效率,浪费⼤量的时间
5.2、隐式等待
隐式等待作⽤域是整个脚本的所有元素。即只要driver对象没有被释放掉( driver.quit() ),隐
式等待就⼀直⽣效。
优点:智能等待,作⽤于全局
#隐式等待
# #1、打开浏览器——驱动管理
ChromeIns=ChromeDriverManager().install()
# ##2、创建谷歌浏览器驱动对象
driver=webdriver.Chrome(service=Service(ChromeIns))
#添加隐式等待
driver.implicitly_wait(2)
# ##3、输入网址
driver.get("https://www.baidu.com/")
driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("迪丽热巴")
driver.find_element(By.CSS_SELECTOR,"#su").click()
driver.find_element(By.CSS_SELECTOR,"#\\31 > div > div > div > div > div > div.new-tag_4ozgi.new-text-link_3k9GD > div > div.baike-slink-wrapper_7k8vl.cu-pb-xs-lg > div > div:nth-child(1) > a > button > div")
driver.quit()
六、浏览器导航(前进、刷新、后退)
浏览器的前进、后退、刷新
# #1、打开浏览器——驱动管理
ChromeIns=ChromeDriverManager().install()
# ##2、创建谷歌浏览器驱动对象
driver=webdriver.Chrome(service=Service(ChromeIns))
# ##3、输入网址
driver.get("https://www.baidu.com/")
driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("迪丽热巴")
driver.find_element(By.CSS_SELECTOR,"#su").click()
time.sleep(2)
#返回到登陆首页
driver.forward()
time.sleep(2)
#后退
driver.back()
time.sleep(2)
#刷新
driver.refresh()
driver.quit()
七、文件上传
点击⽂件上传的场景下会弹窗系统窗⼝,进⾏⽂件的选择。selenium⽆法识别⾮web的控件,上传⽂件窗⼝为系统⾃带,⽆法识别窗⼝元素但是可以使⽤send_keys来上传指定路径的⽂件,达到的效果是⼀样的。
# #1、打开浏览器——驱动管理
ChromeIns=ChromeDriverManager().install()
# ##2、创建谷歌浏览器驱动对象
driver=webdriver.Chrome(service=Service(ChromeIns))
# ##3、输入网址
driver.get("file:///C:/Users/LYQ/Desktop/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E8%AF%BE%E4%BB%B6/selenium-html/upload.html")
##找到上传文件按钮
driver.find_element(By.CSS_SELECTOR,"body > div > div > input[type=file]").send_keys("\\D:\\C语言\\test.txt")
time.sleep(2)
driver.quit()