目录
一、元素的定位
1. cssSelector
2. xpath
2.1 获取HTML页面所有的节点
2.2 获取HTML页面指定的节点
2.3 获取一个节点中的直接子节点
2.4 获取一个节点的父节点
2.5 实现节点属性的匹配
2.6 使用指定索引的方式获取对应的节点内容
二、操作测试对象
1. 点击/提交对象
2. 模拟按键输入
3. 清除文本内容
4. 获取文本信息
5. 获取当前页面标题
6. 获取当前页面URL
三、窗口
1. 切换窗口
2. 窗口设置大小
3. 屏幕截图
4. 关闭窗口
一、元素的定位
- web自动化测试的操作核心是能够找到页面对应的元素,然后才能对元素进行具体的操作。
- 常见的元素定位方式非常多,如id,classname,tagname,xpath,cssSelector。
- 常用的主要有 cssSelector 和 xpath。
常见浏览器打开开发者工具的方法:
1. Google Chrome:
- 右键点击网页,选择“检查”(Inspect)。
- 按 `Ctrl + Shift + I`(Windows/Linux)或 `Command + Option + I`(Mac)。
2. Mozilla Firefox:
- 右键点击网页,选择“检查元素”(Inspect Element)。
- 按 `Ctrl + Shift + I`(Windows/Linux)或 `Command + Option + I`(Mac)。
3. Microsoft Edge:
- 右键点击网页,选择“检查”(Inspect)。
- 按 `Ctrl + Shift + I`(Windows)。
4. Safari:
- 在菜单栏中选择“开发”,然后选择“显示 Web 检查器”(Show Web Inspector)。
- 按 `Command + Option + I`。
5. Opera:
- 右键点击网页,选择“检查”(Inspect)。
- 按 `Ctrl + Shift + I`。
6. Internet Explorer:
- 按 `F12`。
7. 使用快捷键:
- 大多数现代浏览器都支持按 `F12` 打开开发者工具。
8. 菜单栏:
- 在一些浏览器中,你可以通过点击浏览器窗口顶部的菜单栏中的“工具”(Tools)或“更多”(More),然后选择“开发者工具”(Developer Tools)来打开。
注意:不同的浏览器版本可能会有细微的差别,但上述方法应该适用于大多数情况。
1. cssSelector
选择器的功能:选中页面中指定的标签元素。
选择器的种类分为基础选择器和复合选择器,常见的元素定位方式可以通过id选择器和子类选择器来进行定位。
- “搜索输入框元素”: #kw
- “百度一下按钮”: #su
定位百度首页的“百度热搜”元素,可以使用通过id选择器和子类选择器进行定位:#hotsearch-content-wrapper > li
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.ie.service import Service
from webdriver_manager.chrome import ChromeDriverManager
#打开浏览器---驱动管理
ChromeIns = ChromeDriverManager().install()
#创建谷歌浏览器驱动对象
driver = webdriver.Chrome(service=Service(ChromeIns))
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. xpath
XML路径语言,不仅可以在XML文件中查找信息,还可以在HTML中选取节点。
xpath使用路径表达式来选择xml文档中的节点。
xpath语法中:
2.1 获取HTML页面所有的节点
- //*
2.2 获取HTML页面指定的节点
//[指定节点]
- //ul :获取HTML页面所有的ul节点
- //input:获取HTML页面所有的input节点
2.3 获取一个节点中的直接子节点
- /
- //span/input
2.4 获取一个节点的父节点
- ..
- //input/.. 获取input节点的父节点
2.5 实现节点属性的匹配
- [@...]
- //*[@id='kw'] 匹配HTML页面中id属性为kw的节点
2.6 使用指定索引的方式获取对应的节点内容
注意:xpath的索引是从1开始的。
- 例如:百度首页通过://div/ul/li[3] 定位到第三个百度热搜标签
- 更便捷的生成selector/xpath的方式:右键选择复制"Copy selector/xpath"
二、操作测试对象
获取到了页面的元素之后,接下来就是要对元素进行操作了。常见的操作有点击、提交、输入、清除、获取文本。
1. 点击/提交对象
- click()
例:找到百度第一条热搜并点击
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.ie.service import Service
from webdriver_manager.chrome import ChromeDriverManager
#打开浏览器---驱动管理
ChromeIns = ChromeDriverManager().install()
#创建谷歌浏览器驱动对象
driver = webdriver.Chrome(service=Service(ChromeIns))
driver.get("https://www.baidu.com")
time.sleep(1)
#点击事件(查找元素 + 点击按钮)
#第一种写法
driver.find_element(By.CSS_SELECTOR,"#hotsearch-content-wrapper > li:nth-child(1) > a > span.title-content-title").click()
time.sleep(2)
#第二种写法(先查找后点击)
# ele = driver.find_element(By.CSS_SELECTOR, "#hotsearch-content-wrapper > li:nth-child(1) > a > span.title-content-title")
# ele.click()
#关闭浏览器
driver.quit()
2. 模拟按键输入
- send_keys(" ")
例:在百度输入框输入一行文字
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.ie.service import Service
from webdriver_manager.chrome import ChromeDriverManager
#打开浏览器---驱动管理
ChromeIns = ChromeDriverManager().install()
#创建谷歌浏览器驱动对象
driver = webdriver.Chrome(service=Service(ChromeIns))
driver.get("https://www.baidu.com")
time.sleep(1)
#查找元素 + 输入内容
driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("天行健,君子以自强不息")
time.sleep(2)
#关闭浏览器
driver.quit()
3. 清除文本内容
- 输入文本后又想换一个新的关键词,这里就需要用到 clear()
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.ie.service import Service
from webdriver_manager.chrome import ChromeDriverManager
#打开浏览器---驱动管理
ChromeIns = ChromeDriverManager().install()
#创建谷歌浏览器驱动对象
driver = webdriver.Chrome(service=Service(ChromeIns))
driver.get("https://www.baidu.com")
time.sleep(1)
#查找元素 + 输入内容
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()
4. 获取文本信息
- 获取文本信息: text
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.ie.service import Service
from webdriver_manager.chrome import ChromeDriverManager
#打开浏览器---驱动管理
ChromeIns = ChromeDriverManager().install()
#创建谷歌浏览器驱动对象
driver = webdriver.Chrome(service=Service(ChromeIns))
driver.get("https://www.baidu.com")
time.sleep(1)
#获取文本信息
text = driver.find_element(By.CSS_SELECTOR, "#hotsearch-content-wrapper > li:nth-child(1) > a > span.title-content-title").text
print(text)
assert text == "“嫦娥”既是中国的 又属于全人类"
#关闭浏览器
driver.quit()
- 获取属性值: get_attribute("属性名称")
#获取属性值
text = driver.find_element(By.CSS_SELECTOR, "#su").get_attribute("value")
print(text)
5. 获取当前页面标题
- title
#获取当前页面标题
title = driver.title
print(title)
6. 获取当前页面URL
- current_url
#获取当前页面URL
url = driver.current_url
print(url)
三、窗口
1. 切换窗口
1)获取当前页面句柄:
driver.current_window_handle
2)获取所有页面句柄:
driver.window_handles
3)切换当前句柄为最新页面:
for handle in allHandle: if handle != curHandle: driver.switch_to.window(handle)
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.ie.service import Service
from webdriver_manager.chrome import ChromeDriverManager
#打开浏览器---驱动管理
ChromeIns = ChromeDriverManager().install()
#创建谷歌浏览器驱动对象
driver = webdriver.Chrome(service=Service(ChromeIns))
driver.get("https://www.baidu.com")
time.sleep(1)
#点击百度首页的图片功能,跳转到图片页面
#跳转之前百度首页的标题和URL
print("before:"+driver.title)
print("before:"+driver.current_url)
driver.find_element(By.CSS_SELECTOR, "#s-top-left > a:nth-child(8)").click()
#1.获取当前页面句柄
curHandle = driver.current_window_handle
#2.获取所有页面句柄
allHandle = driver.window_handles
#3.切换当前页面为最新页面
for handle in allHandle:
if handle != curHandle:
driver.switch_to.window(handle)
#跳转之后百度图片的标题和URL
print("after:"+driver.title)
print("after:"+driver.current_url)
#关闭浏览器
driver.quit()
2. 窗口设置大小
- 窗口最大化
driver.maximize_window()
- 窗口最小化
driver.minimize_window()
- 窗口全屏
driver.fullscreen_window()
- 手动设置窗口大小
driver.set_window_size(300, 300)
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.ie.service import Service
from webdriver_manager.chrome import ChromeDriverManager
#打开浏览器---驱动管理
ChromeIns = ChromeDriverManager().install()
#创建谷歌浏览器驱动对象
driver = webdriver.Chrome(service=Service(ChromeIns))
driver.get("https://www.baidu.com")
#窗口大小的设置
#窗口最大化
time.sleep(2)
driver.maximize_window()
#窗口最小化
time.sleep(2)
driver.minimize_window()
#窗口全屏
time.sleep(2)
driver.fullscreen_window()
#手动设置窗口大小
time.sleep(2)
driver.set_window_size(300, 300)
#关闭浏览器
driver.quit()
3. 屏幕截图
我们的自动化脚本一般部署在机器上自动的去运行,如果出现了报错,我们是不知道的,但是我们可以通过抓拍来记录当时的错误场景。
🌴简单版本
driver.save_screenshot("./images/image.png")
- 如果不指定图片保存路径,屏幕截图后会自动保存在当前项目同级目录下;
- 如果想保存在指定文件夹下面,就要新建文件夹,步骤如图所示:
🌴高阶版本
由于图片给定的名称是固定的,当我们多次运行自动化脚本时,历史的图片将会被覆盖;所以为了将历史的图片文件保存下来,就需要每次生成的图片文件名称都不一样,这时就得咋们的高阶版本上场了。
from datetime import datetime
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.ie.service import Service
from webdriver_manager.chrome import ChromeDriverManager
#打开浏览器---驱动管理
ChromeIns = ChromeDriverManager().install()
#创建谷歌浏览器驱动对象
driver = webdriver.Chrome(service=Service(ChromeIns))
#打开百度标签页
driver.get("https://www.baidu.com")
#屏幕截图
#1.简单版本
driver.save_screenshot("./images/test.png")
#2.高阶版本
filename = "autotest-"+datetime.now().strftime("%Y-%m-%d-%H%M%S")+".png"
driver.save_screenshot("./images/"+filename)
#关闭浏览器
driver.quit()
4. 关闭窗口
driver.quit():表示退出浏览器,所有的标签页都会被关闭。
driver.close():表示退出一个窗口。
注意:窗口关闭后driver要重新定义。
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.ie.service import Service
from webdriver_manager.chrome import ChromeDriverManager
#打开浏览器---驱动管理
ChromeIns = ChromeDriverManager().install()
#创建谷歌浏览器驱动对象
driver = webdriver.Chrome(service=Service(ChromeIns))
#打开百度标签页
driver.get("https://www.baidu.com")
#打开新的标签页
time.sleep(2)
driver.find_element(By.CSS_SELECTOR, "#s-top-left > a:nth-child(6)").click()
#关闭标签页
time.sleep(2)
driver.close()
#关闭浏览器
time.sleep(2)
driver.quit()