# 导入包 (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!")
# 导入包 (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文件中。
# 选择参数
option = webdriver.ChromeOptions()
# 添加属性值
option.add_argument('--headless')
# 创建浏览器驱动对象
driver = webdriver.Chrome(options=option, service=Service(chrome_driver_path))
option.add_argument('--start-maximized')
option.add_argument('--incognito')
option.add_experimental_option('excludeSwitches', ['enable-automation'])
定位方式 | 代码 |
---|---|
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, ‘新’) |
工具获取
driver.find_element(By.CSS_SELECTOR, '#kw').send_keys('selenium')
手工编写获取
标签和属性组合: 标签名[属性名=属性值]
有多个标签时,标签之前空格相隔
属性可以是任意属性
class/id除了可以采用以上写法外,还可以采用专用写法, 以百度搜索输入框为例:
input.s_ipt # input标签中class属性值为s_ipt
input#kw # input标签中id属性值为kw
input#kw.s_ipt # input标签中id值为kw,class值为s_ipt
表达式 | 描述 |
---|---|
// | 从当前节点获取子孙节点 |
/ | 从当前节点获取直接子节点 |
@ | 选取属性 |
[ ] | 添加筛选条件 |
* | 获取当前节点 |
** | 获取当前节点的父节点 |
nodename | 获取该节点的所有子节点 |
XPath:即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。它被开发者采用来当作小型查询语言.
获取xpath路径有两种方式:
driver.find_element(By.XPATH, '//*[@id="kw"]')
1.纯标签路径:
纯标签路径分两种:一种是绝对路径,另一种是相对路径, 以百度首页输入框为例:
1. 绝对路径:
/html/body/div/div/div[5]/div/div/form/span[1]/input
//form/span[1]/input
2.标签和属性相结合:
语法://标签名[@属性名=属性值]
//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 模糊匹配:
//input[starts-with(@type, "sub")] # 查找input标签中type属性,其值以sub开头的页面元素
//input[ends-with(@type,"mit")] # 查找input标签中type属性,其属性值以mit结尾的页面元素
//input[contains(@class, 's_btn')] # 查找input标签中class属性中含有“s_btn”字符串的页面元素
//div[contains(text(), "热榜")] # 查找div标签中文本中含有“热榜”的页面元素
driver.find_element(By.LINK_TEXT, '新闻').click()
driver.find_element(By.PARTIAL_LINK_TEXT, '新').click()
from selenium.webdriver.support.relative_locator import locate_with
# 获取相对元素
text_locator = locate_with(By.ID,'kw').to_left_of({By.ID: "kw"})
# 注意:
# 目前不知道这个元素能干什么,后续补充!
import time # 先导入模块文件
sleep(3) # 休眠3秒
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时,需要搭配until或until_not方法来使用,其语法格式如下:
until(method, message='')
until_not(method, message='')
# method:指定预期条件的判断方法;
# message:超时后抛出的提示;
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 |
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() # 关闭浏览器并释放进程资源
driver.implicitly_wait(30)
# 隐式地等待一个元素被发现或一个命令完成,这个方法每次会话只需要调用一次。
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}
driver.forward() # 浏览器前进
driver.back() # 浏览器后退
driver.refresh() # 刷新必应网页
# 存储网页元素
iframe = driver.find_element(By.CSS_SELECTOR, "#modal > iframe")
# 切换到选择的 iframe
driver.switch_to.frame(iframe)
# 单击按钮
driver.find_element(By.TAG_NAME, 'button').click()
# 通过 id 切换框架
driver.switch_to.frame('buttonframe')
# 单击按钮
driver.find_element(By.TAG_NAME, 'button').click()
# 基于索引切换到第 2 个 iframe
iframe = driver.find_elements(By.TAG_NAME,'iframe')[1]
# 切换到选择的 iframe
driver.switch_to.frame(iframe)
# 切回到默认内容
driver.switch_to.default_content()
# 打开新闻 Tab 标签
driver.find_element(By.LINK_TEXT,'新闻').click()
# 休眠 1 秒
sleep(1)
# 切换到第一个 Tab 标签
driver.switch_to.window(driver.window_handles[0])
方法 | 描述 |
---|---|
driver.save_screenshot(filename) | 获取当前屏幕截图保存为指定文件,filename指定为完整保存路径或文件名 |
driver.get_screenshot_as_base64() | 获取当前的屏幕截图 base64 编码字符串 |
driver.get_screenshot_as_file(filename) | 获取当前的屏幕截图,使用完整的路径 |
driver.get_screenshot_as_png() | 获取当前屏幕截图的二进制文件数据 |
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)
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)
方法 | 描述 |
---|---|
text | 获取元素文本内容 |
rect | 获取元素位置信息 |
click() | 单击左键 |
send_keys() | 输入内容 |
clear() | 清除内容 |
submit() | 提交表单 |
get_attribute(“属性”) | 获取属性值 |
is_selected() | 是否被选中 |
is_enabled() | 是否可用 |
is_displayed() | 是否显示 |
value_of_css_property() | css 属性值 |
方法 | 描述 |
---|---|
click() | 单击左键 |
context_click() | 单击右键 |
double_click() | 双击左键 |
drag_and_drop() | 鼠标拖动 |
move_to_element() | 鼠标悬停 |
execute_script() | 界面滑动 |
perform() | 执行所有ActionChains中存储的动作 |
from selenium.webdriver.common.by import By
element = driver.find_element(By.ID, 'su') #定位元素
element.click() # 给元素 单击左键
单击右键
依赖:pyautogui第三方支持右键菜单元素操作
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'])
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()
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()
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()
作用:模拟键盘输入内容。
在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 | 向左箭头 |
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)
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')
from selenium.webdriver.common.by import By
# 定位搜索输入框,向搜索输入框中输入文本“selenium"
element = driver.find_element(By.ID, 'kw').send_keys('selenium')
# 等待2s
sleep(2)
# 清除搜索输入框中的文本
element.clear()
from selenium.webdriver.common.by import By
# 定位搜索输入框,向搜索输入框中输入文本“selenium"
driver.find_element(By.ID, 'kw').send_keys('selenium')
#定位搜索按钮,并提交表单
driver.find_element(By.ID, 'su').submit()
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)
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")}')
方法/属性 | 方法/属性描述 |
---|---|
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 | 第一个选中选项 |
from selenium.webdriver.support.select import Select
# 定位下拉框
element = driver..find_element_by_name('selects')
# 选择选项
Select(element).select_by_visible_text('北京')
# 定位 alert 框
driver.find_element(By.ID, 'alert').click()
# 切换到 alert 框
alert = driver.switch_to.alert
# 点击确认
alert.accept()
# 定位 confirm 框
driver.find_element(By.ID, 'confirm').click()
# 切换到 confirm 框
confirm = driver.switch_to.alert
# 点击确认
confirm.accept()
# 点击取消
confirm.dismiss()
# 定位 prompt 框
driver.find_element(By.ID, 'prompt').click()
# 切换到 prompt 框
prompt = driver.switch_to.alert
# 向 prompt 框发送消息
prompt.send_keys('lisainfsad')
# 点击确认
prompt.accept()
# 点击取消
prompt.dismiss()
# 使用execute_script方法执行JavaScript代码来实现鼠标滚动
js='window.scrollTo(0, 500);'
# 向下滚动 500 像素
driver.execute_script(js)