俗话说的好,书读百遍不如手过一遍,而编程这东西是看书看视频一万遍都不如你自己多敲代码、写脑图、总结分享转换成自己的内容来的实在。
今天我就把最近学的(二)**Selenium核心WebDriver API**简单总结一下,方便自己以后找出来看看。
一、页面元素定位、操作
1、页面元素
(1)在浏览器能显示的所有要素:****图片、链接、文本框、按钮、下拉列表、视频****
2、元素的定位方式
**** id****(find_element(value="id值")、默认是by=By.ID可以不写)
****name****(find_element(by=By.****NAME****, value="name值")) ****class name****(find_element(by=By.****CLASS_NAME****, value="class值")) ****tag name****(find_element(by=By.****TAG_NAME****, value="标签名")、重复性太高) ****link text****(find_element(by=By.****LINK_TEXT****, value="链接显示文本")) ****partial link text****(find_element(by=By.****PARTIAL_LINK_TEXT****, value="部分链接显示文本")) ****xpath****(find_element(by=By.****XPATH****, value="xpath值")、xpath是xml中定位元素的语言、绝对路径(/html/body/.../input)、元素属性(//input[@id='kw'])、层级与属性结合(//*[@id='su'])、逻辑运算符) ****css selector****(find_element(by=By.****CSS_SELECTOR****, value="css值")、CSS选择器、.class、#id、*、element、element>element、element+element、[attribute=value])
3、元素的操作方法
****clear()****:清除文本
**** send_keys(value)****:模拟按键输入值(追加、发送字符串、发送快捷键)
**** click()****:单击元素(按钮、超链接、单选框、复选框)
**** current_url****:返回当前页面的url地址
**** title****:返回当前页面的标题title
**** text****:获取页面(提示框、警告框)显示的文本
**** get_attribute(name)****:获取属性值:界面上展示的文本内容使用value属性名、 没有在界面展示文本内容使用innerText/textContent属性名、获取包含元素的HTML文本使用outerHTML、获取不含元素的HTML使用innerHTML
**** is_dispalyed()****:设置该元素是否用户可见
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:bigbear
# datetime:2022/8/27 15:33
# software: PyCharm
"""
定位元素8种方式:driver.find_element(By.属性, "值").操作方法
1、ID属性:百度文本框ID值为ke、百度一下按钮ID值为su
1、NAME属性:百度文本框NAME值为wd
3、CLASS_NAME属性:百度文本框CLASS值为s_ipt
4、TAG_NAME属性:百度文本框的标签名为input,但是页面有相同标签名,所以报错
5、LINK_TEXT属性:链接名为百度首页
6、PARTIAL_LINK_TEXT属性:链接名包含内容有大会这些亮点
7、XPATH属性:
(1)绝对路径:/(根节点)、//(相对节点)、[1](标签名同名为兄弟节点、数字代表顺序、≥1、2个以上的兄弟节点需要写1)
输入框的绝对路径(完整路径):/html/body/div[2]/div[1]/div/div[1]/div/form/span[1]/input
(2)元素属性
输入框://input[@maxlength='255']
(3)层级与属性结合
百度一下按钮://form[@id='form']/span[2]/input
(4)逻辑运算符and、or
百度热搜第一条://a[@target='_blank' and @title='数据说话:中国经济稳定性何来?']
8、CSS_SELECTOR属性:
(1).class
百度首页链接的样式:.toindex
(2)#id
输入框id:#kw
(3)*
所有元素中通过id属性选百度一下按钮:*[id='su']
(4)element
a元素中通过class属性选百度首页链接:a[class='toindex']
(5)element>element
span标签下的input标签确定输入框:span>input
(6)element+element
input标签后所有i标签确定输入框后的清空:input+i
(7)[attribute=value]→[attribute^=value]以值开头、[attribute$=value]以值结尾、[attribute*=value]含有值、
[attribute~=value]含有单独值、[attribute|=value]值右边可以有可以没有值
class属性的值为toindex确定百度首页链接:[class='toindex']
元素的操作方法:
driver.find_element(元素).clear():清除文本
driver.find_element(元素).send_keys(value):模拟按键输入值
driver.find_element(元素).click():单击元素(按钮操作、点击链接)
driver.current_url:返回当前页面的url地址
driver.title:返回当前页面的标题title
driver.find_element(元素).text:获取页面(提示框、警告框)显示的文本
driver.find_element(元素).get_attribute(name):获取属性值:界面上展示的文本内容使用value属性名、
没有在界面展示文本内容使用innerText/textContent属性名、获取包含元素的HTML文本使用outerHTML、获取不含元素的HTML使用innerHTML
driver.find_element(元素).is_dispalyed():判断该元素是否用户可见
driver.find_element(元素).is_enabled():判断该元素是否可用
driver.find_element(元素).is_selected():判断该元素是否被选中(单选框、复选框)
"""
import time
from urllib import parse
from selenium import webdriver
from selenium.webdriver.common.by import By
# 创建浏览器对象
driver = webdriver.Edge()
# 跳转到百度页面
driver.get("https://www.baidu.com")
# 通过输入框的ID属性在框内输入值
driver.find_element(value="kw").send_keys("selenium")
time.sleep(1)
# 通过百度一下按钮的ID属性点击按钮
driver.find_element(By.ID, "su").click()
time.sleep(2)
# 通过输入框的NAME属性清空框内值
driver.find_element(By.NAME, "wd").clear()
time.sleep(1)
# 通过输入框的样式属性在框内输入值
driver.find_element(By.CLASS_NAME, "s_ipt").send_keys("selenium")
time.sleep(1)
# 使用tag name定位报错:selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable
# driver.find_element(By.TAG_NAME, "input").click()
# time.sleep(1)
# 使用link text定位报错:selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate
# element: {"method":"link text","selector":"百度首页"}。解决方法:重新编写这句代码
driver.find_element(By.LINK_TEXT, "百度首页").click()
time.sleep(1)
# driver.find_element(By.PARTIAL_LINK_TEXT, "中国网络文明大会这些亮点别错过").click()
driver.find_element(By.PARTIAL_LINK_TEXT, "文明建设").click()
time.sleep(1)
# 获取最新的窗口句柄列表,切换到当前窗口
driver.switch_to.window(driver.window_handles[-1])
# xpath-绝对路径:/(根节点)、//(相对节点)、[1](标签名同名为兄弟节点、数字代表顺序、≥1、2个以上的兄弟节点需要写1)
driver.find_element(By.XPATH, "/html/body/div[2]/div[1]/div/div[1]/div/form/span[1]/input").clear()
time.sleep(1)
# xpath-元素属性
driver.find_element(By.XPATH, "//input[@maxlength='255']").send_keys("selenium")
time.sleep(1)
# xpath-层级与属性结合
driver.find_element(By.XPATH, "//form[@id='form']/span[2]/input").click()
time.sleep(2)
# xpath-逻辑运算符
driver.find_element(By.XPATH, "//a[@target='_blank' and @title='数据说话:中国经济稳定性何来?']").click()
time.sleep(1)
# 获取最新的窗口句柄列表,切换到当前窗口
driver.switch_to.window(driver.window_handles[-1])
# 输出当前页面的url地址
url = driver.current_url
# urlencode():将中文字典转换为url编码
wd = parse.urlencode({"wd": "数据说话:中国经济稳定性何来?"})
# urlparse:将URL解析成ParseResult对象(协议(scheme)、域名(netloc)、路径(path)、路径参数(params)、查询参数(query)、片段(fragment))
# parse_qs:将查询参数转换为字典格式
wd_cn = parse.parse_qs(parse.urlparse(url).query)['wd']
# unquote():将url编码转换为中文
cn_wd = parse.unquote("".join(wd_cn))
# 判断页面url中搜索文本参数、页面标题是否一致
if url.find(wd) and (cn_wd[:4] == driver.title[:4]):
print(f"{driver.title}---{url}")
else:
print("没有跳转到今日热搜第一条:数据说话:中国经济稳定性何来?")
# 获取页面文本信息
text = driver.find_element(By.CSS_SELECTOR, "#tsn_inner > div:nth-child(2) > span").text
print(f"text:{text}")
# 获取属性值
value = driver.find_element(By.ID, "kw").get_attribute("value")
print(f"get_attribute---{value}")
value0 = driver.find_element(By.ID, "su").get_attribute("class")
print(f"get_attribute---class={value0}")
# 判断元素是否用户可见、是否可用
whether = driver.find_element(By.ID, "su").is_displayed()
whether0 = driver.find_element(By.ID, "su").is_enabled()
if whether and whether0:
print("百度一下按钮显示可用")
else:
print("百度一下按钮显示失败")
# CSS选择器(class选择器):.class
driver.find_element(By.CSS_SELECTOR, ".toindex").click()
time.sleep(1)
# CSS选择器(id选择器):#id
driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("selenium")
time.sleep(1)
# CSS选择器(所有):*
driver.find_element(By.CSS_SELECTOR, "*[id='su']").click()
time.sleep(2)
# CSS选择器(某个元素或某个标签名):element
driver.find_element(By.CSS_SELECTOR, "a[class='toindex']").click()
time.sleep(1)
# CSS选择器(父元素下的所有的某元素):element>element
driver.find_element(By.CSS_SELECTOR, "span > input").send_keys("selenium")
time.sleep(1)
# CSS选择器(同级元素后的所有的某元素):element+element
driver.find_element(By.CSS_SELECTOR, "input + i").click()
time.sleep(1)
# CSS选择器(选择某个键值):[attribute=value]
driver.find_element(By.CSS_SELECTOR, "[class='toindex']").send_keys("selenium")
time.sleep(1)
# 关闭当前窗口
driver.close()
time.sleep(1)
# 退出驱动程序和每个相关窗口
driver.quit()
二、浏览器操作
1、控制窗口大小
**** set_window_size(width,height)**** #设置窗口大小
**** minimize_window() ****#窗口最小化
**** maximize_window()**** #窗口最大化
2、控制后退、前进
**** back()**** #回退到上一个页面
**** forward()**** #前进到下一个页面
3、模拟浏览器刷新
**** refresh()**** #刷新页面
4、截屏
**** save_screenshot("保存地址\图片名.图片格式")****
**** get_screenshot_as_file("保存地址/图片名.图片格式")****
5、模拟关闭
**** close()**** #关闭当前窗口
**** quit()**** #退出驱动程序和每个相关窗口
三、鼠标、键盘操作
1、鼠标
**** ActinoChains(driver)**** #常用语模仿鼠标的行为,如单击、双击、拖拽等行为。都是针对页面元素进行操作
**** context_click()**** #右击
**** dpuble_click()**** #双击
**** drag_and_drop()**** #拖动
**** move_to_element()**** #鼠标悬停
**** perform()**** #执行所有ActionChains中存储的行为
2、键盘
**** Keys()**** #模仿键盘行为,如单键、组合键,多次行为* num
**** Keys.BACK_SPACE**** #删除键
**** Keys.SPACE**** #空格键
**** Keys.TAB**** #制表键
**** Keys.ESCAPE ****#ESC键
**** Keys.ENTER ****#回车键
**** Keys.CONTROL, 'A'**** #ctrl+A|C|X|V:全选、复制、剪切、粘贴
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:bigbear
# datetime:2022/8/29 19:53
# software: PyCharm
"""
浏览器的操作方法:
driver.set_window_size(width=值,height=值) # 设置窗口大小
driver.minimize_window() # 窗口最小化
driver.maximize_window() # 窗口最大化
driver.back() # 回退到上一个页面
driver.forward() # 前进到下一个页面
driver.refresh() # 刷新页面
driver.save_screenshot("保存地址\\图片名.图片格式") # 截屏
driver.get_screenshot_as_file("保存地址/图片名.图片格式") # 截屏
driver.switch_to.window(driver.window_handles[列表下标]) # 获取句柄列表,切换到某个窗口
driver.close() # 关闭当前窗口
driver.quit() # 退出驱动程序和每个相关窗口
鼠标的操作方法:
ActinoChains(driver) # 常用于模仿鼠标的行为,如单击、双击、拖拽等行为
perform() # 执行所有ActionChains中存储的行为
ActionChains(driver).context_click(元素).perform() # 右击
ActionChains(driver).double_click(元素).perform() # 双击
ActionChains(driver).drag_and_drop(来源, 目标).perform() #拖动
ActionChains(driver).move_to_element(元素).perform() # 鼠标悬停
键盘的操作方法:
Keys() # 模仿键盘行为,如单键、组合键,多次行为* num
Keys.BACK_SPACE # 删除键
Keys.SPACE # 空格键
Keys.TAB # 制表键
Keys.ESCAPE # ESC键
Keys.ENTER # 回车键
Keys.CONTROL, 'A' # ctrl+A|C|X|V:全选、复制、剪切、粘贴
"""
import time
from selenium import webdriver
from selenium.webdriver import ActionChains, Keys
from selenium.webdriver.common.by import By
# 创建浏览器对象
driver = webdriver.Edge()
# 跳转到百度页面
driver.get("http://news.baidu.com")
# 通过判断对需要留存的页面进行截屏
driver.save_screenshot(r"..\screenshot\test_driver.png")
# 窗口最大化
driver.maximize_window()
time.sleep(1)
# 通过判断对需要留存的页面进行截屏
driver.get_screenshot_as_file("../screenshot/test_driver_1.png")
# 窗口最小化
driver.minimize_window()
time.sleep(1)
# 通过判断对需要留存的页面进行截屏
driver.get_screenshot_as_file("{}.{}".format("..\\screenshot\\test_driver_2", "png"))
# 设置窗口大小
driver.set_window_size(1280, 1000)
time.sleep(1)
# 通过CSS定位器中的样式定位到百度首页并跳转
driver.find_element(by=By.CSS_SELECTOR, value="#usrbar > ul > li:nth-child(4) > a").click()
# 获取页面中的设置元素
set_ddlist = driver.find_element(value="s-usersetting-top")
# 鼠标悬停到设置上显示不同设置
ActionChains(driver).move_to_element(set_ddlist).perform()
time.sleep(0.5)
# 获取页面中的文本框元素
text_box = driver.find_element(value="kw")
# 鼠标右击文本框显示文本框操作菜单
ActionChains(driver).context_click(text_box).perform()
time.sleep(0.5)
# 获取换一换元素
hyh = driver.find_element(by=By.CSS_SELECTOR, value=".hot-refresh-text")
# 双击换一换切换百度热搜
ActionChains(driver).double_click(hyh).perform()
time.sleep(1)
# 获取百度热搜第4条内容(第2行第2列)
baidu_logo = driver.find_element(by=By.XPATH, value="//*[@id='hotsearch-content-wrapper']/li[4]/a/span[2]")
# 将热搜内容拖拽到文本框中
ActionChains(driver).drag_and_drop(baidu_logo, text_box).perform()
time.sleep(0.5)
# 在文本框中输入内容
text_box.send_keys("selenium")
time.sleep(0.5)
# 全选文本框内容
text_box.send_keys(Keys.CONTROL, 'A')
time.sleep(0.5)
# 复制文本框内容
text_box.send_keys(Keys.CONTROL, 'C')
time.sleep(0.5)
# 剪切文本框内容
text_box.send_keys(Keys.CONTROL, 'X')
time.sleep(0.5)
# 粘贴文本框内容
text_box.send_keys(Keys.CONTROL, 'V')
time.sleep(0.5)
# 删除文本框内容的最后一个字
text_box.send_keys(Keys.BACK_SPACE)
time.sleep(0.5)
# 文本框内容最后添加空格
text_box.send_keys(Keys.SPACE)
time.sleep(0.5)
# 退出文本框预测内容
text_box.send_keys(Keys.ESCAPE)
time.sleep(0.5)
# 切换光标到资讯
text_box.send_keys(Keys.TAB * 2)
time.sleep(0.5)
# 通过回车键进行搜索
text_box.send_keys(Keys.ENTER)
time.sleep(1)
# 回退到上一个页面
driver.back()
time.sleep(1)
# 前进到下一个页面
driver.forward()
time.sleep(1)
# 获取最新的窗口句柄列表,切换到当前窗口
driver.switch_to.window(driver.window_handles[-1])
# 关闭当前窗口
driver.close()
# 关闭驱动程序和所有窗口
driver.quit()
上述代码中的三张截图效果展示
四、警告窗口处理
1、在WebDriver中处理JavaScript所生成的警告模式窗口(alert警告框、confirm确认框、prompt提示框)
**** 模式窗口****:不关闭此窗口,其他操作无法进行
非模式窗口:此窗口不影响其他操作进行
2、从浏览器窗口切换到警告窗口
alert = ****driver.switch_to.alert**** #临时切换到警告 confirm = driver.witch_to.alert #临时切换到确认框 prompt = driver.witch_to.alert #临时切换到提示框
3、对警告窗口操作
msg = alert****.text**** #返回窗口中的文本信息 alert****.accept()**** #接受现有警告窗口(点击确定按钮) alert****.dismiss()**** #放弃现有警告窗口(点击取消按钮)
**** prompt.send_keys()**** #发送文本至警告窗口(仅提示框)
五、多窗口、多表单处理
1、多窗口
list = ****driver.window_handles**** #获取窗口句柄列表 driver.switch_to.window(driver.window_handles[列表下标]) #获取句柄列表,切换到某个窗口
2、多表单
frame、iframe表单内嵌页面上的元素无法直接定位
**** driver.switch_to.frame("frame_name")**** #通过name属性
**** driver.switch_to.frame(1)**** #通过frame、iframe索引
**** driver.switch_to.frame(driver.find_elements(By.TAG_NAME, "iframe")[0])**** #通过frame、iframe表单元素
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:bigbear
# datetime:2022/8/30 19:09
# software: PyCharm
"""
多表单处理:
frame、iframe表单内嵌页面上的元素无法直接定位
driver.switch_to.frame("frame_name") # 通过name属性
driver.switch_to.frame(1) # 通过frame、iframe索引
driver.switch_to.frame(driver.find_elements(By.TAG_NAME, "iframe")[0) # 通过frame、iframe表单元素
"""
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# 创建浏览器对象
driver = webdriver.Edge()
driver.set_window_size(1180, 1000)
# 跳转到百度页面
driver.get("https://www.qq.com/")
# 点击邮箱图表进入邮箱登录界面
driver.find_element(by=By.LINK_TEXT, value="Qmail").click()
# 多窗口处理:通过窗口句柄切换到当前QQ邮箱页面
driver.switch_to.window(driver.window_handles[-1])
# 多表单处理:通过name属性切换到frame、iframe表单内嵌页面
# driver.switch_to.frame("login_frame")
# 多表单处理:通过索引切换到frame、iframe表单内嵌页面(微信和QQ登录各有一个iframe表单)
# driver.switch_to.frame(1)
# 多表单处理:通过frame、iframe表单元素切换到frame、iframe表单内嵌页面(微信和QQ登录各有一个iframe表单)
driver.switch_to.frame(driver.find_elements(By.TAG_NAME, "iframe")[-1])
time.sleep(0.5)
# 输入QQ邮箱和密码
driver.find_element(value="u").send_keys("[email protected]")
time.sleep(0.5)
driver.find_element(value="p").send_keys("123456")
time.sleep(0.5)
# 点击登录
driver.find_element(value="login_button").click()
time.sleep(0.5)
# 关闭程序和窗口
driver.quit()
六、时间等待
1、强制等待
**** time.sleep(5)**** #线程等待固定时间5秒
2、隐式等待
**** driver.implicitly_wait(time_to_wait)**** #智能等待(全局、优先于显式等待、定位到元素直接执行、超时则抛出异常、适用于加载较慢的页面)、time_to_wait最大等待时间(此阶段会不断刷新页面)
3、显式等待
**** wait.WebDriverWait(driver, timeout,** poll_frequency=0.5).until(method,** info********)**** #等待某个元素的出现或某个元素的可点击、超时则抛出异常、timeout最长等待时间30秒、poll_frequency默认每隔0.5秒检测一次、expected_conditions判断条件alert_is_present页面存在警告框、presence_of_element_located()页面存在的元素
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:bigbear
# datetime:2022/8/30 10:12
# software: PyCharm
"""
警告窗口处理:
(1)在WebDriver中处理JavaScript所生成的警告模式窗口(alert警告框、confirm确认框、prompt提示框)
模式窗口:不关闭此窗口,其他操作无法进行
非模式窗口:此窗口不影响其他操作进行
(2)从浏览器窗口切换到警告窗口
alert = driver.switch_to.alert # 临时切换到警告框
confirm = driver.witch_to.alert # 临时切换到确认框
prompt = driver.witch_to.alert # 临时切换到提示框
(3)对警告窗口操作
msg = alert.text # 返回窗口中的文本信息
alert.accept() # 接受现有警告窗口(点击确定按钮)
alert.dismiss() # 放弃现有警告窗口(点击取消按钮)
prompt.send_keys() # 发送文本至警告窗口(仅提示框)
时间等待:
(1)强制等待
time.sleep(5) #线程等待固定时间5秒
(2)隐式等待
driver.implicitly_wait(time_to_wait) #智能等待(全局、优先于显式等待、定位到元素直接执行、超时则抛出异常)、time_to_wait最大等待时间(此阶段会不断刷新页面)
(3)显式等待
wait.WebDriverWait(driver, timeout, poll_frequency=0.5).until(method, info)
#等待某个元素的出现或某个元素的可点击、超时则抛出异常、timeout最长等待时间30秒、poll_frequency默认每隔0.5秒检测一次、
expected_conditions判断条件、alert_is_present页面存在警告框、presence_of_element_located()页面存在的元素
"""
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# from selenium.webdriver.support import wait, expected_conditions # 显示等待时导入的包
# 创建浏览器对象
driver = webdriver.Edge()
# 隐式等待:智能等待、time_to_wait最大等待时间
driver.implicitly_wait(5)
# 跳转到百度页面
driver.get("https://www.selenium.dev/zh-cn/documentation/webdriver/browser/alerts/")
# 显示等待:timeout最长等待时间30秒、poll_frequency默认每隔0.5秒检测一次、expected_conditions判断条件、alert_is_present是页面存在警告框
# wait.WebDriverWait(driver, 30, ignored_exceptions=None).until(expected_conditions.presence_of_element_located(
# By=ID, "alerts-警告框"), "timeout")
# 点击查看样例警告框
driver.find_element(by=By.LINK_TEXT, value="查看样例警告框").click()
# 强制等待:固定时间1秒
time.sleep(1)
# 临时将窗口对象从浏览器窗口切换到警告框
alert = driver.switch_to.alert
# 获取警告框中的文本信息
alert_msg = alert.text
print(f"警告信息:{alert_msg}")
# 点击警告框确定按钮
alert.accept()
time.sleep(1)
# 点击查看样例确认框
driver.find_element(by=By.LINK_TEXT, value="查看样例确认框").click()
time.sleep(1)
# 临时将窗口对象从浏览器窗口切换到确认框
confirm = driver.switch_to.alert
# 获取确认框中的文本信息
confirm_msg = confirm.text
print(f"确认信息:{confirm_msg}")
# 点击确认框取消按钮
confirm.dismiss()
time.sleep(1)
# 点击查看样例提示框
driver.find_element(by=By.LINK_TEXT, value="查看样例提示框").click()
time.sleep(1)
# 临时将窗口对象从浏览器窗口切换到提示框
prompt = driver.switch_to.alert
# 获取提示框中的文本信息
prompt_msg = prompt.text
print(f"提示信息:{prompt_msg}")
# 向提示框发送文本信息、注意:这里不起作用
prompt.send_keys("简单测试一下可以吗")
time.sleep(1)
# 点击警提示框确定按钮
prompt.accept()
time.sleep(1)
# 退出程序关闭窗口
driver.close()
愿你我都能为中华民族的伟大复兴尽一份绵薄力量,让中华文化的根扎根在中国这片绿水青山之上,让新一代中华儿女传承与发扬!!!
---无名之辈
以上内容均是本人自学,当然是有网上公布的内容,如有冒犯,请留言,立即改正,谢谢!
看完要是觉得对自己有用,动一下您那根金色的会一指禅的右手食指,按一下您的鼠标左键,在对应的那个位置点个赞,亦或者在评论区留下您的绝顶好句,亦或者收藏在您的收藏夹里,再走也不迟嘛!您说要不要得!谢谢您的阅读和赞赏!
版权归原作者 bigbear_001 所有, 如有侵权,请联系我们删除。