Selenium(3 + 4 超级详细笔记)

文章目录

  • selenium(web自动化测试)
    • [1. selenium初始化(2种)](#1. selenium初始化(2种))
    • [2. chrome 启动参数(3种)](#2. chrome 启动参数(3种))
    • [3. 八大定位方式](#3. 八大定位方式)
      • [3.1 css 定位](#3.1 css 定位)
      • [3.2 xpath 定位](#3.2 xpath 定位)
      • [3.3 link_text 定位](#3.3 link_text 定位)
      • [3.4 partial_link_text 定位](#3.4 partial_link_text 定位)
      • [3.5 relative 相对定位](#3.5 relative 相对定位)
    • [4. 添加等待时间](#4. 添加等待时间)
      • [4.1 休眠等待:time(调式)](#4.1 休眠等待:time(调式))
      • [4.2 显式等待:Explicit Waits(常用)](#4.2 显式等待:Explicit Waits(常用))
      • [4.3 隐式等待:Implicit Waits](#4.3 隐式等待:Implicit Waits)
    • [5. 浏览器操作(WebDriver方法)](#5. 浏览器操作(WebDriver方法))
      • [5.1 获取信息](#5.1 获取信息)
      • [5.2 导航](#5.2 导航)
      • [5.3 切换框架(iframe)](#5.3 切换框架(iframe))
      • [5.4 切换窗口(window)](#5.4 切换窗口(window))
      • [5.5 屏幕截图](#5.5 屏幕截图)
    • [6. 元素操作(WebElement方法)](#6. 元素操作(WebElement方法))
      • [6.1 鼠标操作(click)](#6.1 鼠标操作(click))
      • [6.2 键盘操作(send_keys)](#6.2 键盘操作(send_keys))
      • [6.3 其它操作(4种)](#6.3 其它操作(4种))
    • [7. 下拉框操作(Select)](#7. 下拉框操作(Select))
    • [8. 提示框操作(Prompt box)](#8. 提示框操作(Prompt box))
    • [9. 执行 JS 脚本](#9. 执行 JS 脚本)
    • [10. PO(page object) 框架](#10. PO(page object) 框架)

selenium(web自动化测试)

1. selenium初始化(2种)

  • 方式一
python 复制代码
# 导入包 (selenium 4版本)
import pytest, os
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
# 用 os 处理路径
chrome_driver_path = os.path.abspath(os.path.join(os.path.dirname(os.path.dirname(__file__)), 'drivers/chromedriver.exe'))
edge_driver_path = os.path.abspath(os.path.join(os.path.dirname(os.path.dirname(__file__)), 'drivers/msedgedriver.exe'))
# 处理测试初始化
@pytest.fixture(scope='session')
def open_close_browser():
    print("Open browser!")
    # 调起 chrome 浏览器
    driver = webdriver.Chrome(service=Service(chrome_driver_path))
    # 调起 edge 浏览器
    # driver = webdriver.Edge(service=Service(edge_driver_path))
    yield driver
    print("Close browser!")
    driver.close()
    print("Test over!")
  • 方式二 :(推荐
python 复制代码
# 导入包 (selenium 4版本)
import pytest, os
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from webdriver_manager.microsoft import EdgeChromiumDriverManager
from webdriver_manager.microsoft import IEDriverManager
from webdriver_manager.firefox import GeckoDriverManager
# 处理测试初始化
print("Open browser!")
    # 调起 chrome 浏览器
    # 设置 option 参数(选择)
    service = Service(executable_path=ChromeDriverManager().install())
    driver = webdriver.Chrome(service=service)
    # 调起 edge 浏览器
    # service = Service(executable_path=EdgeChromiumDriverManager().install())
    # driver = webdriver.Edge(service=service)
    # 调起 ie 浏览器
    # service = Service(executable_path=IEDriverManager().install())
    # driver = webdriver.Ie(service=service)
    # 调起 firefox 浏览器
    # service = Service(executable_path=GeckoDriverManager().install())
    # driver = webdriver.Firefox(service=service)
    yield driver
    print("Close browser!")
    driver.close()
    print("Test over!")
    
# 自动下载的 driver(驱动)在C盘的用户夹下的.wdn文件中。

2. chrome 启动参数(3种)

  • --headless : 无界面运行(示例
python 复制代码
# 选择参数
option = webdriver.ChromeOptions()
# 添加属性值
option.add_argument('--headless')
# 创建浏览器驱动对象
driver = webdriver.Chrome(options=option, service=Service(chrome_driver_path))
  • --start-maximized: 窗口最大化运行
python 复制代码
option.add_argument('--start-maximized')
  • --incognito: 隐身模式运行
python 复制代码
option.add_argument('--incognito')
  • 不展示"浏览器正在被自动化程序控制"提示
python 复制代码
option.add_experimental_option('excludeSwitches', ['enable-automation'])

3. 八大定位方式

定位方式 代码
id 定位 driver.find_element(By.ID, 'kw')
name 定位 driver.find_element(By.NAME, 'wd')
classname 定位 driver.find_element(By.CLASS_NAME, 's_ipt')
tar_name 定位 driver.find_element(By.TAG_NAME, 'input')
css 定位 1. driver.find_element(By.CSS_SELECTOR, '#kw') # CSS选择器 2. driver.find_element(By.CSS_SELECTOR, 'input.s_plt') # CSS选择器
xpath 定位 driver.find_element(By.XPATH, '//*[@id="kw"]')
link_text 定位 driver.find_element(By.LINK_TEXT, '新闻')
partial_link_text 定位 driver.find_element(By.PARTIAL_LINK_TEXT, '新')

3.1 css 定位

工具获取

  • 通过chrome开发者工具复制可得, 百度首页为例,css定位搜索输入框
python 复制代码
driver.find_element(By.CSS_SELECTOR, '#kw').send_keys('selenium')

手工编写获取

  • 标签和属性组合: 标签名[属性名=属性值]

  • 有多个标签时,标签之前空格相隔

  • 属性可以是任意属性

  • class/id除了可以采用以上写法外,还可以采用专用写法, 以百度搜索输入框为例:

    • 通过class编写: 标签名.class属性值
    python 复制代码
    input.s_ipt 	# input标签中class属性值为s_ipt
    • 通过id编写: 标签名#id属性值
    python 复制代码
    input#kw 		# input标签中id属性值为kw
    • class 和 id 组合
    python 复制代码
    input#kw.s_ipt 	# input标签中id值为kw,class值为s_ipt

3.2 xpath 定位

表达式 描述
// 从当前节点获取子孙节点
/ 从当前节点获取直接子节点
@ 选取属性
[ ] 添加筛选条件
* 获取当前节点
** 获取当前节点的父节点
nodename 获取该节点的所有子节点
  • XPath:即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。它被开发者采用来当作小型查询语言.

  • 获取xpath路径有两种方式:

    • 通过开发者工具复制 xpath 路径
    python 复制代码
    driver.find_element(By.XPATH, '//*[@id="kw"]')
    • 手工编写 xpath 路径

    1.纯标签路径

    纯标签路径分两种:一种是绝对路径,另一种是相对路径, 以百度首页输入框为例:

    ​ 1. 绝对路径:

    python 复制代码
    /html/body/div/div/div[5]/div/div/form/span[1]/input
    1. 相对路径:
    python 复制代码
    //form/span[1]/input

    2.标签和属性相结合

    语法://标签名[@属性名=属性值]

    python 复制代码
    //input[@id='kw']		# 查找input标签中属性id值为kw的页面元素
    //*[@id='kw'] 			# 查找属性为id='kw'的页面元素
    //span/input[@id='kw'] 	# 标签也可以有多个
    //span[@class='bg s_ipt_wr quickdelete-wrap']/input # 还可以使用上层标签的属性帮助定位

    3. xpath 模糊匹配

    • starts-with: 以什么开头
    python 复制代码
    //input[starts-with(@type, "sub")] # 查找input标签中type属性,其值以sub开头的页面元素
    • ends-with: 以什么结尾(注:chrome使用的是xpath1.0版本,不支持此项模糊查询)
    python 复制代码
    //input[ends-with(@type,"mit")] # 查找input标签中type属性,其属性值以mit结尾的页面元素
    • contains: 包含
    python 复制代码
    //input[contains(@class, 's_btn')] # 查找input标签中class属性中含有"s_btn"字符串的页面元素
    • contains: 包含text
    python 复制代码
    //div[contains(text(), "热榜")] # 查找div标签中文本中含有"热榜"的页面元素
  • link_text定位文字链接
python 复制代码
driver.find_element(By.LINK_TEXT, '新闻').click()
  • partial_link_text通过部分文字定位文字链接
python 复制代码
driver.find_element(By.PARTIAL_LINK_TEXT, '新').click()

3.5 relative 相对定位

  • to_left_of:定位位于指定元素左侧的元素。
  • to_right_of:定位位于指定元素右侧的元素。
  • above:定位位于指定元素上方的元素。
  • below:定位位于指定元素下方的元素。
python 复制代码
from selenium.webdriver.support.relative_locator import locate_with
# 获取相对元素
text_locator = locate_with(By.ID,'kw').to_left_of({By.ID: "kw"})
# 注意:
# 目前不知道这个元素能干什么,后续补充!

4. 添加等待时间

4.1 休眠等待:time(调式)

  • 有时候为了保证脚本运行的稳定性,需要脚本中添加等待时间, 添加休眠:
python 复制代码
import time # 先导入模块文件
sleep(3) # 休眠3秒

4.2 显式等待:Explicit Waits(常用)

  • 显式等待主要是使用WebDriverWait来实现,其语法格式如下:
python 复制代码
from selenium.webdriver.support.wait import WebDriverWait

WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)

# driver:浏览器驱动;
# timeout:最长超时时间,默认以秒为单位;
# poll_frequency:检测的间隔步长,默认为0.5s;
# ignored_exceptions:超时后的抛出的异常信息,默认抛出NoSuchElementExeception异常。

在使用WebDriverWait 时,需要搭配untiluntil_not方法来使用,其语法格式如下:

python 复制代码
until(method, message='')
until_not(method, message='')

# method:指定预期条件的判断方法;
# message:超时后抛出的提示;
  • 示例
python 复制代码
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 创建 Wait 对象
wait = WebDriverWait(driver,2,0.3)
wait.until(EC.title_is('标题'))
# 后续操作
方法 描述 类型
title_is('') 判断当前页面的 title 是否等于预期 布尔
title_contains('') 判断当前页面的 title 是否包含预期字符串 布尔
presence_of_element_located(locator) 判断元素是否被加到了 dom 树里,并不代表该元素一定可见 WebElement
visibility_of_element_located(locator) 判断元素是否可见,可见代表元素非隐藏,并且元素的宽和高都不等于0 WebElement
visibility_of(element) 跟上一个方法作用相同,但传入参数为 element WebElement
text_to_be_present_in_element(locator ,'') 判断元素中的 text 是否包含了预期的字符串 布尔
text_to_be_present_in_element_value(locator ,'') 判断元素中的 value 属性是否包含了预期的字符串 布尔
frame_to_be_available_and_switch_to_it(locator) 判断该 frame 是否可以 switch 进去,True 则 switch 进去,反之 False 布尔
invisibility_of_element_located(locator) 判断元素中是否不存在于 dom 树或不可见 布尔
element_to_be_clickable(locator) 判断元素中是否可见并且是可点击的 布尔
staleness_of(element) 等待元素是否从 dom 树中移除 布尔
element_to_be_selected(element) 判断元素是否被选中,一般用在下拉列表 布尔
element_selection_state_to_be(element,True) 判断元素的选中状态是否符合预期,参数 element,第二个参数为 True/False 布尔
element_located_selection_state_to_be(locator,True) 跟上一个方法作用相同,但传入参数为 locator 布尔
alert_is_present() 判断页面上是否存在 alert alert
  • 示例代码:
python 复制代码
from time import sleep
from selenium import webdriver
from selenium.webdriver import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
 
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
element = WebDriverWait(driver, 2,0.5,ignored_exceptions=None).until(EC.presence_of_element_located((By.ID, 'toolbar-search-input')),message='超时!') # 定位不存在的标签
element.send_keys('NBA',Keys.ENTER)
sleep(5)    	# 休眠5秒
driver.quit()   # 关闭浏览器并释放进程资源

4.3 隐式等待:Implicit Waits

  • 适用场景:一般在 Browser 初始化阶段(conftest文件中)使用。
python 复制代码
driver.implicitly_wait(30)

# 隐式地等待一个元素被发现或一个命令完成,这个方法每次会话只需要调用一次。

5. 浏览器操作(WebDriver方法)

5.1 获取信息

  • 获取浏览器信息,其方法分别如下所示:
python 复制代码
driver = webdriver.Chrome()
driver.title  		# 获取浏览器当前页面的标签
driver.current_url  # 获取浏览器当前地址栏的URL
driver.page_source  # 获取当前html源码
driver.name  		# 获取浏览器名称(chrome)
driver.current_window_handle	# 窗口句柄
driver.window_handles			# 当前窗口的所有句柄
driver.get_window_rect() 		# 获取浏览器尺寸,位置
driver.get_window_position() 	# 获取浏览器位置(左上角)

# 运行结果:
{'width': 1552, 'height': 840}
{'x': -8, 'y': -8}

5.2 导航

  • 浏览器导航,其实现方法分别为:
python 复制代码
driver.forward() 	# 浏览器前进
driver.back() 		# 浏览器后退
driver.refresh() 	# 刷新必应网页

5.3 切换框架(iframe)

  • 使用 WebElement
python 复制代码
# 存储网页元素
iframe = driver.find_element(By.CSS_SELECTOR, "#modal > iframe")

# 切换到选择的 iframe
driver.switch_to.frame(iframe)

# 单击按钮
driver.find_element(By.TAG_NAME, 'button').click()
  • 使用 name 或 id
python 复制代码
# 通过 id 切换框架
driver.switch_to.frame('buttonframe')

# 单击按钮
driver.find_element(By.TAG_NAME, 'button').click()
  • 使用索引
python 复制代码
# 基于索引切换到第 2 个 iframe
iframe = driver.find_elements(By.TAG_NAME,'iframe')[1]

# 切换到选择的 iframe
driver.switch_to.frame(iframe)
  • 离开框架
python 复制代码
# 切回到默认内容
driver.switch_to.default_content()

5.4 切换窗口(window)

python 复制代码
# 打开新闻 Tab 标签
driver.find_element(By.LINK_TEXT,'新闻').click()
# 休眠 1 秒
sleep(1)
# 切换到第一个 Tab 标签
driver.switch_to.window(driver.window_handles[0])

5.5 屏幕截图

  • 常用的截图方法如下:
方法 描述
driver.save_screenshot(filename) 获取当前屏幕截图保存为指定文件,filename指定为完整保存路径或文件名
driver.get_screenshot_as_base64() 获取当前的屏幕截图 base64 编码字符串
driver.get_screenshot_as_file(filename) 获取当前的屏幕截图,使用完整的路径
driver.get_screenshot_as_png() 获取当前屏幕截图的二进制文件数据
  • 获取当前屏幕截图的案例:
python 复制代码
from time import sleep, strftime, localtime, time
# 文件路径名
filename = os.path.abspath(os.path.dirname(__file__)) + '/screenshot.png'
filename = 'screenshot.com'
# 图片的时间信息
st = strftime("%Y-%m-%d-%H-%M-%S", localtime(time()))
filename = st + '.png'
# 获取屏幕截图
driver.save_screenshot(filename)
  • 获取截屏保存到文件夹中:
python 复制代码
import os 
from time import sleep, strftime, localtime, time
# 图片的时间信息
st = strftime("%Y-%m-%d-%H-%M-%S", localtime(time()))
file_name = st + '.png'
# 路径
path = os.path.abspath('screenshot')
file_path = path + '/' + file_name
# 获取屏幕截图
driver.save_screenshot_as_file(file_path)

6. 元素操作(WebElement方法)

  • 常用的元素操作方法如下:
方法 描述
text 获取元素文本内容
rect 获取元素位置信息
click() 单击左键
send_keys() 输入内容
clear() 清除内容
submit() 提交表单
get_attribute("属性") 获取属性值
is_selected() 是否被选中
is_enabled() 是否可用
is_displayed() 是否显示
value_of_css_property() css 属性值

6.1 鼠标操作(click)

  • 常用的鼠标操作方法如下:
方法 描述
click() 单击左键
context_click() 单击右键
double_click() 双击左键
drag_and_drop() 鼠标拖动
move_to_element() 鼠标悬停
execute_script() 界面滑动
perform() 执行所有ActionChains中存储的动作
  • 单击左键
python 复制代码
from selenium.webdriver.common.by import By

element = driver.find_element(By.ID, 'su') #定位元素
element.click() # 给元素 单击左键
  • 单击右键

  • 依赖pyautogui第三方支持右键菜单元素操作

python 复制代码
import pyautogui
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
#定位元素
element = driver.find_element(By.ID, 'su') 
# 给元素 单击右键
ActionChains(driver).context_click(element).perform() 
# 等待2s
sleep(2)
# 
pyautogui.typewrite(['down', 'down', 'return'])
  • 双击左键
python 复制代码
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
# 定位元素
element = driver.find_element(By.ID, 'su') 
# 给元素 双击左键
ActionChains(driver).double_click(element).perform() 
  • 鼠标拖动
python 复制代码
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains

# 定位要拖动的元素
source = driver.find_element('选择器','xxx')
# 定位目标元素
target = driver.find_element('选择器','xx')
# 执行拖动动作
ActionChains(driver).drag_and_drop(source, target).perform()
  • 鼠标悬停
python 复制代码
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
#定位元素
element = driver.find_element(By.XPATH, '"//div/a[@class='s-bri c-font-normal c-color-t']"') 
# 给元素 鼠标悬停
ActionChains(driver).move_to_element(element).perform() 

6.2 键盘操作(send_keys)

  • 作用:模拟键盘输入内容。

  • 在webdriver中的keys类中,提供了很多按键方法,常用的按键操作有:

操作 描述
Keys.ENTER 回车键
Keys.BACK_SPACE 删除键
Keys.F1 F1键
Keys.SPACE 空格
Keys.CONTROL Ctrl键
Keys.TAB Tab键
Keys.ESCAPE ESC键
Keys.ALT Alt键
Keys.SHIFT Shift键
Keys.ARROW_UP 向上箭头
Keys.ARROW_RIGHT 向右箭头
Keys.ARROW_DOWN 向下箭头
Keys.ARROW_LEFT 向左箭头
  • 回车键操作案例:
python 复制代码
from selenium.webdriver.common.by import By
from selenium.webdriver import Keys
# 定位元素
element = driver.find_element(By.ID, 'kw') 
# 给元素 双击左键
element.send_keys('selenium', Keys.ENTER)
  • 复制,粘贴操作案例:
python 复制代码
from selenium.webdriver.common.by import By
from selenium.webdriver import Keys
# 定位元素
element = driver.find_element(By.ID, 'kw') 
# 全选文本
element.send_keys(Keys.CONTROL, 'a')
element.send_keys(Keys.CONTROL, 'c')
element.send_keys(Keys.CONTROL, 'v')

6.3 其它操作(4种)

  • 清除输入框的内容:clear()
python 复制代码
from selenium.webdriver.common.by import By
# 定位搜索输入框,向搜索输入框中输入文本"selenium"
element = driver.find_element(By.ID, 'kw').send_keys('selenium')  
# 等待2s
sleep(2) 
# 清除搜索输入框中的文本
element.clear() 
  • 提交表单:submit()
python 复制代码
from selenium.webdriver.common.by import By
# 定位搜索输入框,向搜索输入框中输入文本"selenium"
driver.find_element(By.ID, 'kw').send_keys('selenium')  
#定位搜索按钮,并提交表单
driver.find_element(By.ID, 'su').submit() 
  • 获取元素文本内容:text
python 复制代码
from selenium.webdriver.common.by import By
# 定位文本框
element = driver.find_element(By.CSS_SELECTOR, '#bottom_layer > div > p:nth-child(3) > a')
# 等待2s
sleep(1)
# 打印出元素文本内容
print('get text:', element.text)
  • 获取页面元素属性:get_attribute("属性")
python 复制代码
from selenium.webdriver.common.by import By
# 定位文本输入框
element = driver.find_element(By.ID, 'kw')
# 打印文本输入框的 name 属性
print(f'the attribute value of element is: {element.get_attribute("name")}')

7. 下拉框操作(Select)

  • 常用的下拉框操作方法如下:
方法/属性 方法/属性描述
select_by_value() 根据值选择
select_by_index() 根据索引选择
select_by_visible_text() 根据文本选择
deselect_by_value() 根据值反选
deselect_by_index() 根据索引反选
deselect_by_visible_text() 根据文本反选
deselect_all() 反选所有
options 所有选项
all_selected_options 所有选中选项
first_selected_option 第一个选中选项
  • 根据值选择案例:
python 复制代码
from selenium.webdriver.support.select import Select
# 定位下拉框
element = driver..find_element_by_name('selects')
# 选择选项
Select(element).select_by_visible_text('北京')

8. 提示框操作(Prompt box)

  • alert 框: 只有一个确定按钮。
python 复制代码
# 定位 alert 框
driver.find_element(By.ID, 'alert').click()
# 切换到 alert 框
alert = driver.switch_to.alert
# 点击确认
alert.accept()
  • confirm 框 :两个按钮,一个"确定 "按钮,另一个是"取消"按钮。
python 复制代码
# 定位 confirm 框
driver.find_element(By.ID, 'confirm').click()
# 切换到 confirm 框
confirm = driver.switch_to.alert
# 点击确认
confirm.accept()
# 点击取消
confirm.dismiss()
  • prompt 框 : 一个文本输入框,一个"确定 "按钮和一个"取消"按钮。
python 复制代码
# 定位 prompt 框
driver.find_element(By.ID, 'prompt').click()
# 切换到 prompt 框
prompt = driver.switch_to.alert
# 向 prompt 框发送消息
prompt.send_keys('lisainfsad')
# 点击确认
prompt.accept()
# 点击取消
prompt.dismiss()

9. 执行 JS 脚本

  • 界面滑动案例:
python 复制代码
# 使用execute_script方法执行JavaScript代码来实现鼠标滚动
js='window.scrollTo(0, 500);' 
# 向下滚动 500 像素
driver.execute_script(js) 

10. PO(page object) 框架

相关推荐
岑梓铭1 分钟前
《考研408数据结构》第六章(5.1+5.2+5.3树、二叉树、线索二叉树)复习笔记
数据结构·笔记·考研·408·1024程序员节
摇滚侠1 小时前
全面掌握 PostgreSQL 关系型数据库,PostgreSQL 介绍,笔记02
数据库·笔记·postgresql
摇滚侠1 小时前
Spring Boot3零基础教程,生命周期监听,自定义监听器,笔记59
java·开发语言·spring boot·笔记
张人玉2 小时前
WPF 控件速查 PDF 笔记(可直接落地版)
笔记·microsoft·wpf
摇滚侠2 小时前
Spring Boot3零基础教程,事件驱动开发,设计登录成功后增加积分记录信息功能,笔记61
java·spring boot·笔记·后端
minhuan2 小时前
构建AI智能体:七十五、用扣子平台创建工作流:从自动化到智能化的进阶之路
运维·自动化·工作流构建·意图识别工作流
Elias不吃糖2 小时前
Qt TCP 网络通信详解(笔记)
笔记·qt·tcp/ip
charlie1145141912 小时前
2D 计算机图形学基础速建——1
笔记·学习·教程·计算机图形学·基础
im_AMBER2 小时前
React 07
前端·笔记·学习·react.js·前端框架
9ilk2 小时前
【仿RabbitMQ的发布订阅式消息队列】--- 介绍
linux·笔记·分布式·后端·rabbitmq