Ⅰ Selenium框架之浏览器操作
【一】页面操作
【1】初始化浏览器对象
- 前期我们将Chrome驱动添加到环境变量了,所以我们可以直接初始化界面。(或者也可以通过指定绝对路径的方式)
# 【1】方案一:将你的驱动放到你的 Python 环境变量下 Scripts 文件夹下
# 我们不指定驱动的位置 在selenium 打开浏览器的时候时间就会很长
# 【2】方案二:给当前的selenium指定驱动位置
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.service import Service
# 创建一个 service 对象 指定驱动位置
service = Service(executable_path="./chromedriver")
# 启动selenium
browser = Chrome(service=service)
'''
# 补充 在以前的版本中 指定驱动位置
Chrome(
executable_path="./chromedriver"
)
'''
(1)方式一:使用环境变量
from selenium import webdriver
# 初始化浏览器为chrome浏览器
browser = webdriver.Chrome()
browser = webdriver.Chrome(path)
# 关闭浏览器
browser.close()
(2)方式二:使用绝对路径
from selenium import webdriver
# 初始化浏览器为chrome浏览器
# 指定绝对路径的方式(可选)
path = r'./chromedriver'
browser = webdriver.Chrome()
browser.get("https://www.jd.com")
# 关闭浏览器
browser.close()
【二】访问页面
- 进行页面访问使用的是get方法,传入参数为待访问页面的URL地址即可。
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.service import Service
# 创建一个 service 对象 指定驱动位置
service = Service(executable_path="./chromedriver")
# 启动selenium
browser = Chrome(service=service)
# 打开页面
# 使用创建好的驱动 发送 get 请求打开指定网址
browser.get("https://www.baidu.com")
【三】设置浏览器大小
【1】自定义窗口大小
- set_window_size()方法可以用来设置浏览器大小(就是分辨率)
# 自定义窗口大小
browser.set_window_size(width=400,height=400)
【2】让当前窗口全屏化
# 让当前窗口全屏化
browser.maximize_window()
【四】让浏览器前进和后退
- 前进后退也是我们在使用浏览器时非常常见的操作
- forward()方法可以用来实现前进
- back()可以用来实现后退。
# forward() : 让浏览器前进
# back() : 让浏览器回退
import time
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.service import Service
# 创建一个 service 对象 指定驱动位置
service = Service(executable_path="./chromedriver.exe")
# 启动selenium
browser = Chrome(service=service)
# 【二】打开页面
# 使用创建好的驱动 发送 get 请求打开指定网址
browser.get("https://www.baidu.com")
browser.get("https://www.jd.com/")
time.sleep(3)
# 【1】先让浏览器回退到百度页面
browser.back()
time.sleep(3)
# 【2】让浏览器从百度回退到京东页面
browser.forward()
【五】获取当前页面的基础属性
【1】当前浏览器的页面的标题
# 当前浏览器的页面的标题
# print(browser.title) # 百度一下,你就知道
【2】当前浏览器的页面的URL
# 当前浏览器的页面的URL
print(browser.current_url) # https://www.baidu.com/
【3】当前浏览器的名称
# 当前浏览器的名称
print(browser.name) # chrome
【4】获取当前页面的源码
# 获取当前页面的源码
print(browser.page_source)
【六】切换选项卡
【1】借助 js 代码操作来打开新的选项卡
# 借助 js 代码操作来打开新的选项卡
browser.execute_script("window.open('https://www.jd.com/')")
【2】获取当前所有选项卡的句柄列表
# 获取当前所有选项卡的句柄列表
print(browser.window_handles) # ['C7278CB32F2488772AF56D32F06CC1BD', '08A96741455E337A4710FA93F8255CE0']
【3】切换到百度选项卡
# 切换到百度想选卡
browser.switch_to.window(browser.window_handles[0])
【4】示例
from selenium import webdriver
import time
# 创建 Chrome 浏览器的实例
browser = webdriver.Chrome()
# 打开百度网页
browser.get('https://www.baidu.com/')
# 隐式等待2秒,确保页面加载完全
browser.implicitly_wait(2)
# 打印当前窗口句柄
print(browser.window_handles)
# 在当前浏览器实例中新开一个选项卡
browser.execute_script('window.open()')
# 获取所有选项卡的句柄列表
all_handles = browser.window_handles
# 切换到第二个选项卡(下标为1)
browser.switch_to.window(all_handles[1])
# 在第二个选项卡中打开淘宝网页
browser.get('http://www.taobao.com')
# 等待2秒
time.sleep(2)
# 切换回第一个选项卡(下标为0)
browser.switch_to.window(all_handles[0])
# 在第一个选项卡中打开hao123网页
browser.get('http://www.hao123.com')
# 等待2秒
time.sleep(2)
# 关闭当前选项卡
browser.close()
# 关闭浏览器实例
browser.quit()
Ⅱ Selenium框架之定位页面元素
【一】前言引入
- 使用 selenium 定位页面元素的前提是你已经了解基本的页面布局及各种标签含义,当然如果之前没有接触过,现在我也可以带你简单的了解一下。
- 以我们熟知的 百度为例,我们进入首页,按 【F12】 进入开发者工具。
- 红框中显示的就是页面的代码,我们要做的就是从代码中定位获取我们需要的元素。

【二】八大选择器介绍
- 我们在实际使用浏览器的时候,很重要的操作有输入文本、点击确定等等。
- 对此,Selenium提供了一系列的方法来方便我们实现以上操作。
- 通过webdriver对象的 find_element(by=“属性名”, value=“属性值”),主要包括以下这八种。
| 属性 |
函数 |
| CLASS |
find_element(by=By.CLASS_NAME, value=‘’) |
| XPATH |
find_element(by=By.XPATH, value=‘’) |
| LINK_TEXT |
find_element(by=By.LINK_TEXT, value=‘’) |
| PARTIAL_LINK_TEXT |
find_element(by=By.PARTIAL_LINK_TEXT, value=‘’) |
| TAG |
find_element(by=By.TAG_NAME, value=‘’) |
| CSS |
find_element(by=By.CSS_SELECTOR, value=‘’) |
| ID |
find_element(by=By.ID, value=‘’) |
【三】八大选择器示例
【1】ID
# 根据ID值获取指定标签
input_search = browser.find_element(By.ID,"kw")
- 使用 find_element 方法,通过元素的 ID 属性进行定位。
- 将 'kw' 替换为你要查找的元素的实际 ID。
【2】Name
# Name
element = bro.find_element(By.NAME, 'element_name')
- 使用 find_element 方法,通过元素的 Name 属性进行定位。
- 将 'element_name' 替换为你要查找的元素的实际 Name。
【3】Class
# 根据class值找
input_search = browser.find_element(By.CLASS_NAME,"s_ipt")
- 使用 find_element 方法,通过元素的 Class 属性进行定位。
- 将 's_ipt' 替换为你要查找的元素的实际 Class。
【4】根据标签名找
# 根据标签名找
input_search = browser.find_element(By.TAG_NAME,"div")
- 使用 find_elements 方法,通过标签名进行定位。
- 将 'div' 替换为你要查找的具体标签名,如 'a'、'span'。
【5】css选择器
# css选择器
input_search = browser.find_element(By.CSS_SELECTOR,"#kw")
- 使用 find_element 方法,通过 CSS 选择器进行定位。
- 将 '#kw' 替换为你要使用的实际 CSS 选择器。
【6】xpath选择器
# xpath选择器
input_search = browser.find_element(By.XPATH,'//*[@id="kw"]')
print(input_search)
- 使用 find_element 方法,通过 XPath 表达式进行定位。
- 将 '//*[@id="kw"]' 替换为你要使用的实际 XPath 表达式。
Ⅲ 元素操作(节点交互)
- Selenium可以驱动浏览器来执行一些操作,也就是说可以让浏览器模拟执行一些动作。
- 比较常见的用法有:
- 输入文字时用send_keys()方法,
- 清空文字时用clear()方法,
- 点击按钮时用click()方法。
kw1.clear() #清除元素的值
kw1.click() #点击元素
kw1.id #Selenium所使用的内部ID
kw1.get_property('background') #获取元素的属性的值
kw1.get_attribute('id') #获取元素的属性的值
kw1.location #不滚动获取元素的坐标
kw1.location_once_scrolled_into_view #不滚动且底部对齐并获取元素的坐标
kw1.parent #父元素
kw1.send_keys('') #向元素内输入值
kw1.size #大小
kw1.submit #提交
kw1.screenshot('2.png') #截取元素形状并保存为图片
kw1.tag_name #标签名
kw1.text #内容,如果是表单元素则无法获取
kw1.is_selected() #判断元素是否被选中
kw1.is_enabled() #判断元素是否可编辑
kw1.is_displayed #判断元素是否显示
kw1.value_of_css_property('color') #获取元素属性的值
kw1._upload('2.png') #上传文件
- find_element方法仅仅能够获取元素对象,接下来就可以对元素执行以下操作 从定位到的元素中提取数据的方法
【一】从定位到的元素中获取数据
el.get_attribute(key) # 获取key属性名对应的属性值
el.text # 获取开闭标签之间的文本内容
【二】对定位到的元素的操作
el.click() # 对元素执行点击操作
el.submit() # 对元素执行提交操作
el.clear() # 清空可输入元素中的数据
el.send_keys(data) # 向可输入元素输入数据
【三】示例
# 在获取到浏览器的标签后对标签进行交互 输入内容点击清除等操作
import time
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
service = Service(executable_path="./chromedriver.exe")
browser = Chrome(service=service)
# 打开百度页面
browser.get("https://www.jd.com/")
# 找到搜索框
input_search = browser.find_element(By.XPATH, '//*[@id="key"]')
# 向搜索框内输入内容
input_search.send_keys("手机")
time.sleep(1)
# 清空上面的内容 输入新的内容
input_search.clear()
time.sleep(1)
input_search.send_keys("电脑")
time.sleep(1)
# 获取到当前的搜索按钮
input_search_btn = browser.find_element(By.XPATH, '//*[@id="search"]/div/div[2]/button')
time.sleep(1)
input_search_btn.click()
#
time.sleep(5)
Ⅳ Selenium框架之动作链
【一】前言引入
- 在上面的实例中,一些交互动作都是针对某个节点执行的。
- 比如,对于输入框,我们就调用它的输入文字和清空文字方法;
- 对于按钮,就调用它的点击方法。
- 其实,还有另外一些操作,它们没有特定的执行对象,
- 比如鼠标拖曳、键盘按键等,
- 这些动作用另一种方式来执行,
- 那就是动作链。
【二】模拟鼠标操作
- 既然是模拟浏览器操作,自然也就需要能模拟鼠标的一些操作了,这里需要导入ActionChains 类。
from selenium.webdriver.common.action_chains import ActionChains
- 这个其实就是页面交互操作中的点击click()操作。
| 操作 |
函数 |
| 右击 |
context_click() |
| 双击 |
double_click() |
| 拖拽 |
double_and_drop() |
| 悬停 |
move_to_element() |
| 执行 |
perform() |
【三】模拟键盘操作
from selenium.webdriver.common.keys import Keys
| 操作 |
函数 |
| 删除键 |
send_keys(Keys.BACK_SPACE) |
| 空格键 |
send_keys(Keys.SPACE) |
| 制表键 |
send_keys(Keys.TAB) |
| 回退键 |
send_keys(Keys.ESCAPE) |
| 回车 |
send_keys(Keys.ENTER) |
| 全选 |
send_keys(Keys.CONTRL,‘a’) |
| 复制 |
send_keys(Keys.CONTRL,‘c’) |
| 剪切 |
send_keys(Keys.CONTRL,‘x’) |
| 粘贴 |
send_keys(Keys.CONTRL,‘x’) |
| 键盘F1 |
send_keys(Keys.F1) |
【四】示例
import time
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
service = Service(
executable_path="./chromedriver.exe"
)
browser = Chrome(service=service)
browser.get("https://www.baidu.com")
search_input = browser.find_element(
By.XPATH, '//*[@id="kw"]'
)
search_input.send_keys("Python")
time.sleep(2)
search_input.send_keys(
Keys.CONTROL, "a"
)
search_input.send_keys(
Keys.CONTROL, "c"
)
time.sleep(2)
search_input.clear()
time.sleep(2)
search_input.send_keys(
Keys.CONTROL, 'v'
)
time.sleep(2)
search_input.send_keys(
Keys.ENTER
)
time.sleep(5)
【五】事件监听
# 鼠标左键单击
click(on_element=None)
# 单击鼠标左键,不松开
click_and_hold(on_element=None)
# 单击鼠标右键
context_click(on_element=None)
# 双击鼠标左键
double_click(on_element=None)
# 拖拽到某个元素然后松开
drag_and_drop(source,target)
# 拖拽到某个坐标然后松开
drag_and_drop_by_offset(source,xoffset,yoffset)
# 按下键盘上的某个键
key_down(value,element=None)
# 松开键盘上的某个键
key_up(value, element=None)
# 鼠标从当前位置移动到某个坐标
move_by_offset(xoffset, yoffset)
# 鼠标移动到某个元素
move_to_element(to_element)
# 移动到距某个元素(左上角坐标)多少距离的位置
move_to_element_with_offset(to_element, xoffset, yoffset)
# 暂停所有输入(指定持续时间以秒为单位)
pause(seconds)
# 执行所有操作
perform()
# 结束已经存在的操作并重置
reset_actions()
# 在某个元素位置松开鼠标左键
release(on_element=None)
# 发送某个键或者输入文本到当前焦点的元素
send_keys(*keys_to_send)
# 发送某个键到指定元素
send_keys_to_element(element, *keys_to_send)
【六】动作链
# 创建一系列的鼠标操作让浏览器自动执行
# 【1】语法
# (1)创建动作链对象
# 参数是当前生成的浏览器对象
# action = ActionChains(browser)
# (2)把动作关联到动作链对象中
# action.drag_and_drop(source, target)
# (3)立即执行动作链
# action.perform()
【1】方式一
# 拿到动作链对象
actions=ActionChains(bro)
# 把动作放到动作链中,准备串行执行
actions.drag_and_drop(sourse,target)
# 执行所有操作
actions.perform()
【2】方式二
# 鼠标按住源元素不放
ActionChains(bro).click_and_hold(sourse).perform()
# 计算鼠标需要移动的距离
distance=target.location['x']-sourse.location['x']
# 定义初识距离为 0
track=0
# 判断当前移动距离和目标距离
while track < distance:
# 每次鼠标移动距离向右偏移 2 像素
ActionChains(bro).move_by_offset(xoffset=2,yoffset=0).perform()
# 总滑动距离 增加
track+=2
# 松开鼠标
ActionChains(driver).release().perform()
【七】动作链示例
import time
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import ActionChains
service = Service(
executable_path="./chromedriver.exe"
)
browser = Chrome(service=service)
action = ActionChains(browser)
browser.get("http://sahitest.com/demo/dragDropMooTools.htm")
time.sleep(2)
# 需要被拖拽的方块
source_element = browser.find_element(By.XPATH, '//*[@id="dragger"]')
target_element_list = []
for i in range(2, 6):
target_element_i = browser.find_element(By.XPATH, f'/html/body/div[{i}]')
target_element_list.append(target_element_i)
# 让动作链对象移动到第一个位置
action.drag_and_drop(source_element, target_element_list[0]).perform()
time.sleep(2)
# 让动作链对象移动到第二个位置
action.click_and_hold(source_element).release(target_element_list[1]).perform()
time.sleep(2)
# 让动作链对象移动到第三个位置
action.click_and_hold(source_element).move_to_element(target_element_list[2]).release().perform()
time.sleep(2)
# 让动作链对象移动到第四个位置
action.click_and_hold(source_element).move_by_offset(400, 100).release().perform()
time.sleep(2)
【八】iframe动作链
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import ActionChains
import time
service = Service(
executable_path="./chromedriver.exe"
)
browser = Chrome(service=service)
action = ActionChains(browser)
browser.get("https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable")
browser.implicitly_wait(3)
# 切换到页面嵌入进去的 iframe 标签里面
browser.switch_to.frame(browser.find_elements(By.TAG_NAME, "iframe")[0])
# 在 iframe 标签内部查找 指定标签对象
source_element = browser.find_element(By.XPATH, '//*[@id="draggable"]')
# 在 iframe 标签内部查找 指定标签对象
target_element = browser.find_element(By.XPATH, '//*[@id="droppable"]')
# 方式一:一次性直接从原本地址滑动到目标的地址
# 绑定动作链
'''
action.drag_and_drop(source_element,target_element).perform()
'''
# 方式二:从源地址缓慢欢动至目标地址
action.click_and_hold(source_element).perform()
# 计算实际滑动所需要的距离
# print(source_element.location)# {'x': 8, 'y': 8}
distance = target_element.location["x"] - source_element.location["x"]
track = 0
every_track = 4
while track < distance:
action.move_by_offset(xoffset=every_track, yoffset=0)
track += every_track
action.release().perform()
time.sleep(2)
【九】模拟登陆百度账号
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
# 创建 Chrome 浏览器实例
bro = webdriver.Chrome()
bro.get('https://www.baidu.com') # 打开百度首页
# 隐式等待,设置为 10 秒,即最多等待 10 秒
bro.implicitly_wait(10)
# 最大化浏览器窗口
bro.maximize_window()
# 找到登录按钮并点击
# 如果是a标签,可以根据a标签文字找
submit_login = bro.find_element(By.LINK_TEXT, '登录')
submit_login.click()
# 点击短信登录选项
sms_login = bro.find_element(By.ID, 'TANGRAM__PSP_11__headerLoginTab')
sms_login.click()
time.sleep(1) # 等待 1 秒
# 切换到用户名密码登录方式
username_login = bro.find_element(By.ID, 'TANGRAM__PSP_11__changePwdCodeItem')
username_login.click()
time.sleep(1) # 等待 1 秒
# 输入用户名和密码
username = bro.find_element(By.ID, 'TANGRAM__PSP_11__userName')
username.send_keys('自己账号')
password = bro.find_element(By.ID, 'TANGRAM__PSP_11__password')
password.send_keys('自己密码')
# 提交登录表单
login = bro.find_element(By.ID, 'TANGRAM__PSP_11__submit')
time.sleep(1) # 等待 1 秒
login.submit()
time.sleep(3) # 等待 3 秒
bro.close() # 关闭浏览器窗口
import time
import random
from selenium import webdriver
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
service = Service(executable_path="./chromedriver.exe")
# 禁止浏览器被监控提示
options = Options()
options.add_experimental_option("excludeSwitches", ["enable-automation"])
# 创建 浏览器对象
browser = Chrome(service=service, options=options)
# 打开百度页面
browser.get("https://www.baidu.com")
time.sleep(2)
# //*[@id="s-top-loginbtn"]
# 点击登录按钮
login_button = browser.find_element(By.XPATH,'//*[@id="s-top-loginbtn"]')
login_button.click()
time.sleep(2) # 等待登录框弹出
choice_code = input("请输入验证码:账号(z)还是短信(d)登录>>>>>>")
if choice_code == "z":
# # 点击账号登录 //*[@id="TANGRAM__PSP_11__changePwdCodeItem"]
up_login = browser.find_element(By.XPATH, '//*[@id="TANGRAM__PSP_11__changePwdCodeItem"]')
up_login.click()
time.sleep(2)
# 输入用户名和密码进行登录
username_field = browser.find_element(By.XPATH, '//*[@id="TANGRAM__PSP_11__userName"]')
password_field = browser.find_element(By.XPATH, '//*[@id="TANGRAM__PSP_11__password"]')
username = "自己账号"
password = "自己密码"
username_field.send_keys(username)
password_field.send_keys(password)
time.sleep(2)
# 点击接受阅读//*[@id="TANGRAM__PSP_11__isAgree"]
read_button = browser.find_element(By.XPATH, '//*[@id="TANGRAM__PSP_11__isAgree"]')
read_button.click()
time.sleep(2)
# 登录 //*[@id="TANGRAM__PSP_11__submit"]
verify_submit = browser.find_element(By.XPATH, '//*[@id="TANGRAM__PSP_11__submit"]')
verify_submit.click()
time.sleep(5) # 等待登录完成
if choice_code == "d":
# 点击短信登录 //*[@id="TANGRAM__PSP_11__changeSmsCodeItem"]
SMS_login = browser.find_element(By.XPATH,'//*[@id="TANGRAM__PSP_11__changeSmsCodeItem"]')
SMS_login.click()
time.sleep(2)
# 输入用户名和密码进行登录
username_field = browser.find_element(By.XPATH, '//*[@id="TANGRAM__PSP_11__smsPhone"]')
username = "自己账号"
username_field.send_keys(username)
time.sleep(2)
# 获取验证码
verification_field = browser.find_element(By.XPATH,'//*[@id="TANGRAM__PSP_11__smsTimer"]')
verification_field.click()
time.sleep(2)
# 发送验证码 //*[@id="TANGRAM__PSP_11__smsTimer"]
# //*[@id="TANGRAM__PSP_11__smsVerifyCode"] 输入验证码
verification_input = browser.find_element(By.XPATH,'//*[@id="TANGRAM__PSP_11__smsVerifyCode"]')
# 这里需要手动输入验证码,通过手机查看验证码,然后输入到下面的代码中
verification_code = input("请输入验证码:")
verification_input.send_keys(verification_code)
time.sleep(1)
# 点击接受阅读//*[@id="TANGRAM__PSP_11__smsIsAgree"]
read_button = browser.find_element(By.XPATH,'//*[@id="TANGRAM__PSP_11__smsIsAgree"]')
read_button.click()
time.sleep(2)
# 登录//*[@id="TANGRAM__PSP_11__smsSubmit"]
verify_submit = browser.find_element(By.XPATH, '//*[@id="TANGRAM__PSP_11__smsSubmit"]')
verify_submit.click()
time.sleep(5) # 等待登录完成
Ⅴ Selenium框架之执行JS代码
【一】前言引入
- selenium并不是万能的,有时候页面上操作无法实现的,这时候就需要借助JS来完成了。
- 当页面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接定位到,会报元素不可见的。
- 这时候需要借助滚动条来拖动屏幕,使被操作的元素显示在当前的屏幕上。
- 滚动条是无法直接用定位工具来定位的。
- selenium里面也没有直接的方法去控制滚动条,这时候只能借助Js代码了,
- 还好selenium提供了一个操作js的方法:
- execute_script(),可以直接执行js的脚本。
【二】滚动到页面底部
import time
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
service = Service(
executable_path="./chromedriver.exe"
)
browser = Chrome(service=service)
browser.get("https://www.jd.com/")
# 滑动到页面底部
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
time.sleep(3)
【三】点击元素
import time
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
service = Service(
executable_path="./chromedriver.exe"
)
browser = Chrome(service=service)
browser.get("https://www.jd.com/")
# 点击页面元素
# 先找到当前的 点击对象
search_btn = browser.find_element(By.XPATH,'//*[@id="search"]/div/div[2]/button')
# 方式一
search_btn.click()
time.sleep(3)
# 方式二:使用js代码
browser.execute_script('arguments[0].click();', search_btn)
time.sleep(3)
- 这里使用了execute_script方法执行JavaScript脚本来点击按钮。
- arguments[0]表示传递给JavaScript脚本的第一个参数(即element),通过调用click()方法实现点击操作。
【四】输入文本
import time
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
service = Service(
executable_path="./chromedriver.exe"
)
browser = Chrome(service=service)
browser.get("https://www.jd.com/")
# 向输入框输入文本
search_input = browser.find_element(By.XPATH, '//*[@id="key"]')
search_input.send_keys()
browser.execute_script('arguments[0].value="手机";', search_input)
time.sleep(2)
search_btn.click()
time.sleep(3)
- 同样地,使用execute_script方法执行JavaScript脚本来向文本框输入文本。
- arguments[0]表示传递给JavaScript脚本的第一个参数(即element),通过将value属性设置为arguments[1]来输入文本。
【五】拖动元素
import time
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
service = Service(
executable_path="./chromedriver.exe"
)
browser = Chrome(service=service)
browser.get("https://www.jd.com/")
# 使用JavaScript拖动一个可拖动的元素到目标位置
source_element = browser.find_element(By.ID,'source_element_id')
target_element = browser.find_element(By.ID,'target_element_id')
browser.execute_script('''
var source = arguments[0], target = arguments[1];
var offsetX = target.getBoundingClientRect().left - source.getBoundingClientRect().left;
var offsetY = target.getBoundingClientRect().top - source.getBoundingClientRect().top;
var event = new MouseEvent('mousedown', { bubbles: true, cancelable: true, view: window });
source.dispatchEvent(event);
event = new MouseEvent('mousemove', { bubbles: true, cancelable: true, view: window, clientX: offsetX, clientY: offsetY });
source.dispatchEvent(event);
event = new MouseEvent('mouseup', { bubbles: true, cancelable: true, view: window });
source.dispatchEvent(event);
''', source_element, target_element)
time.sleep(3)
- 上述示例中,我们使用execute_script方法执行了一段JavaScript代码来实现拖动操作。
- 首先,获取源元素和目标元素的位置信息,然后创建鼠标事件并分发到源元素上,模拟鼠标按下、移动和松开的动作,从而实现拖动操作。
【六】获取元素属性
import time
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
service = Service(
executable_path="./chromedriver.exe"
)
browser = Chrome(service=service)
browser.get("https://www.jd.com/")
# 使用JavaScript获取元素的属性值
element = browser.find_element(By.ID,'element_id')
attribute_value = browser.execute_script('return arguments[0].getAttribute("attribute_name");', element)
print(attribute_value)
time.sleep(3)
- 通过execute_script方法执行JavaScript脚本来获取目标元素的属性值。
- 这里使用getAttribute方法传递属性名参数来返回对应的属性值。
【七】案例
import time
# 【一】滑动到页面底部
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
service = Service(
executable_path="./chromedriver.exe"
)
browser = Chrome(service=service)
browser.get("https://www.jd.com/")
# 【1】滑动到页面底部
# browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
# 【2】点击页面元素
# 先找到当前的 点击对象
search_btn = browser.find_element(By.XPATH,'//*[@id="search"]/div/div[2]/button')
# 方式一
# search_btn.click()
# 方式二:使用js代码
# browser.execute_script('arguments[0].click();', search_btn)
# 【3】向输入框输入文本
# search_input = browser.find_element(By.XPATH, '//*[@id="key"]')
# search_input.send_keys()
# browser.execute_script('arguments[0].value="手机";', search_input)
# time.sleep(2)
# search_btn.click()
# 【4】控制当前拖动标签
"""
# 使用JavaScript拖动一个可拖动的元素到目标位置
source_element = browser.find_element(By.ID,'source_element_id')
target_element = browser.find_element(By.ID,'target_element_id')
browser.execute_script('''
var source = arguments[0], target = arguments[1];
var offsetX = target.getBoundingClientRect().left - source.getBoundingClientRect().left;
var offsetY = target.getBoundingClientRect().top - source.getBoundingClientRect().top;
var event = new MouseEvent('mousedown', { bubbles: true, cancelable: true, view: window });
source.dispatchEvent(event);
event = new MouseEvent('mousemove', { bubbles: true, cancelable: true, view: window, clientX: offsetX, clientY: offsetY });
source.dispatchEvent(event);
event = new MouseEvent('mouseup', { bubbles: true, cancelable: true, view: window });
source.dispatchEvent(event);
''', source_element, target_element)
"""
# 【5】获取标签的属性值
'''
# 使用JavaScript获取元素的属性值
element = browser.find_element(By.ID,'element_id')
attribute_value = browser.execute_script('return arguments[0].getAttribute("attribute_name");', element)
print(attribute_value)
'''
time.sleep(2)
Ⅵ Selenium框架之页面等待
【一】为什么需要等待
- 如果网站采用了动态html技术,那么页面上的部分元素出现时间便不能确定,
- 这个时候就可以设置一个等待时间,强制等待指定时间
- 等待结束之后进行元素定位,如果还是无法定位到则报错
【二】页面等待的三种方法
【1】强制等待
- 也叫线程等待, 通过线程休眠的方式完成的等待
- 如等待5秒: Thread sleep(5000)
- 一般情况下不太使用强制等待,主要应用的场景在于不同系统交互的地方。
import time
time.sleep(n) # 阻塞等待设定的秒数之后再继续往下执行
【2】显式等待
- 也称为智能等待,针对指定元素定位指定等待时间
- 在指定时间范围内进行元素查找,找到元素则直接返回
- 如果在超时还没有找到元素,则抛出异常
- 显示等待是 selenium 当中比较灵活的一种等待方式,他的实现原理其实是通过 while 循环不停的尝试需要进行的操作。
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 设置WebDriver等待时间为最多10秒,每隔0.5秒检查一次
#每隔 0.5s 检查一次(默认就是 0.5s)
# 最多等待 10 秒,否则报错。
#如果定位到元素则直接结束等待
#如果在10秒结束之后仍未定位到元素则报错
wait = WebDriverWait(chrome, 10, 0.5)
# 等待页面中的元素"J_goodsList"出现
wait.until(EC.presence_of_element_located((By.ID, 'J_goodsList'))
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
chrome = webdriver.Chrome()
# 携带 cookie 访问京东
cookies = ""
cookie_dict = {cookie.split("=", 1)[0].strip(): cookie.split("=", 1)[1].strip() for cookie in
[cookie for cookie in cookies.split(";")]}
chrome.get('https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA')
for name, value in cookie_dict.items():
chrome.add_cookie({'name': name, 'value': value})
chrome.get('https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA')
# 设置WebDriver等待时间为最多10秒,每隔0.5秒检查一次
# 每隔 0.5s 检查一次(默认就是 0.5s)
# 最多等待 10 秒,否则报错。
# 如果定位到元素则直接结束等待
# 如果在10秒结束之后仍未定位到元素则报错
wait = WebDriverWait(chrome, 10, 0.5)
# 等待页面中的元素"J_goodsList"出现
wait.until(EC.presence_of_element_located((By.ID, 'J_goodsList')))
【3】隐式等待
- 隐式等待设置之后代码中的所有元素定位都会做隐式等待
- 通过implicitly Wait完成的延时等待,注意这种是针对全局设置的等待
- 如设置超时时间为10秒,使用了implicitlyWait后
- 如果第一次没有找到元素,会在10秒之内不断循环去找元素
- 如果超过10秒还没有找到,则抛出异常
- 隐式等待比较智能,它可以通过全局配置,但是只能用于元素定位
# 不需要等待页面全部加载完成后再去执行代码
# 而是只要我想要获取的标签加载完毕就立即获取当前标签代码
driver.implicitly_wait(10)
# 在指定的n秒内每隔一段时间尝试定位元素,如果n秒结束还未被定位出来则报错
【三】显示等待和隐式等待的区别
【1】显示等待
- 原理:显示等待,就是明确要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,就会跳出异常Exception
- (简而言之,就是直到元素出现才去操作,如果超时则报异常)
【2】隐式等待
- 原理:隐式等待,就是在创建driver时,为浏览器对象创建一个等待时间,这个方法是得不到某个元素就等待一段时间,直到拿到某个元素位置。
- 注意:在使用隐式等待的时候,实际上浏览器会在你自己设定的时间内部断的刷新页面去寻找我们需要的元素
Ⅶ Selenium框架之Cookie操作
# 先使用 selenium 自动化登陆
# 从登录后的页面中获取到登陆的Cookie
# 将这个 Cookie 扔给 requests 去进行数据抓取
【一】常用方法
- webdriver中提供了操作cookie的相关方法:
# 获得cookie信息
get_cookies()
# 添加cookie
add_cookie(cookie_dict)
# 删除特定(部分)的cookie
delete_cookie(name)
# 删除所有的cookie
delete_all_cookies()
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.service import Service
service = Service(executable_path="./chromedriver.exe")
browser = Chrome(service=service)
# browser.add_cookie()
# browser.delete_cookie(name)
# browser.delete_all_cookies()
【二】add_cookie()
【1】源码中的解释
def add_cookie(self, cookie_dict) -> None:
"""Adds a cookie to your current session.
:Args:
- cookie_dict: A dictionary object, with required keys - "name" and "value";
optional keys - "path", "domain", "secure", "httpOnly", "expiry", "sameSite"
:Usage:
::
driver.add_cookie({'name' : 'foo', 'value' : 'bar'})
driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'path' : '/'})
driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'path' : '/', 'secure' : True})
driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'sameSite' : 'Strict'})
"""
if "sameSite" in cookie_dict:
assert cookie_dict["sameSite"] in ["Strict", "Lax", "None"]
self.execute(Command.ADD_COOKIE, {"cookie": cookie_dict})
else:
self.execute(Command.ADD_COOKIE, {"cookie": cookie_dict})
- 从中可以看出add_cookie()这个函数有一个参数cookie_dict,它是以字典的形式传入的
- 字典中必选的键是"name"和"value"
- 可选的键是"path", "domin", "secure","expiry","httponly"。
【2】cookie中键名的含义
name cookie的名称
value cookie对应的值,动态生成的
domain 服务器域名
expiry Cookie有效终止日期
path Path属性定义了Web服务器上哪些路径下的页面可获取服务器设置的Cookie
httpOnly 防脚本攻击
secure 在Cookie中标记该变量,表明浏览器和服务器之间的通信协议为加密认证协议。
【三】实例
【1】第一次测试
from selenium import webdriver
driver = webdriver.Chrome()
cookies = {"value": "value", "name": "name"}
driver.add_cookie(cookie_dict=cookies)
driver.get("https://www.ketangpai.com/Main/index.html")
- 运行结果后发现报错了:Message: unable to set cookie。
- 解决方案:必须先加载网站,这样Selenium 才能知道cookie 属于哪个网站。
【2】第二次测试
from selenium import webdriver
driver = webdriver.Chrome()
cookies = {"value": "value", "name": "name"}
driver.get("https://www.ketangpai.com/User/login.html")
driver.add_cookie(cookie_dict=cookies)
driver.get("https://www.ketangpai.com/Main/index.html")
Ⅷ Selenium框架之无头浏览器
【一】前言引入
- 无头浏览器,即 Headless Browser,是一种没有界面的浏览器。
- 它拥有完整的浏览器内核,包括 JavaScript 解析引擎、渲染引擎等。
- 与普通浏览器最大的不同是,无头浏览器执行过程中看不到运行的界面,但是我们依然可以用 GUI 测试框架的截图功能截取它执行中的页面。
# 我们在 用 selenium 打开网页的时候 你能看到页面正在加载过程
# 有些情况下你打开浏览器是需要占用资源的
# 不看到打开的页面的过程
【二】浏览器的渲染机制
- 这里总结一下浏览器如何渲染网页,简单的说浏览器的渲染机制可以分为五步:
- 第一步:解析html,构建DOM树
- 第二步:解析CSS,生成CSSOM树
- 第三步:合并dom树和css规则树,生成render渲染树
- 第四步:根据render渲染树进行布局
- 第五步:调用GPU对渲染树进行绘制,合成图层,显示在屏幕上
- 在这里就可以看出,当无头浏览器不做渲染时,速度显然会提升很多!
【三】主要应用场景
- 无头浏览器主要应用在: GUI 自动化测试、页面监控、网络爬虫以及没有桌面的linux系统中。
【四】优缺点
【1】优点
(1)测试执行速度更快
- 由于无需加载可视化界面,Headless模式下的测试速度通常比普通模式更快。
- 这对于大规模测试或需要频繁执行的测试场景非常有利。
(2)减少对测试执行的干扰。
- Headless模式下的测试不会弹出可见的浏览器窗口,可以在后台静默运行,不影响用户体验。
- 同时,由于无需考虑浏览器窗口的操作,测试更稳定,容易集成到持续集成(CI)系统中。
(3)节省资源
- 一台机器上同时运行不同厂商的无头浏览器(无头浏览器占用内存资源,要比正常浏览器小),实现测试用例的并发执行。
【2】缺点
- 不能完全模拟真实的用户行为
- 不便于调试(各个浏览器的开发者工具)
【五】selenium 增加无头浏览器
【1】模板
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# 创建 ChromeOptions 实例
chrome_options = Options()
# 配置 ChromeOptions 的参数
# 指定浏览器分辨率
chrome_options.add_argument('window-size=1920x3000')
# 规避 bug,需要加上这个属性
chrome_options.add_argument('--disable-gpu')
# 隐藏滚动条,应对特殊页面
chrome_options.add_argument('--hide-scrollbars')
chrome_options.add_argument('blink-settings=imagesEnabled=false')
# 不加载图片,提升速度
chrome_options.add_argument('--headless')
# 无头模式,不提供可视化页面。在 Linux 下,如果系统不支持可视化,不加这条会启动失败
# chrome_options.binary_location = r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
# 手动指定
# 创建 Chrome WebDriver 实例,并传入配置参数
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://www.baidu.com') # 打开百度首页
# 在页面源代码中查找关键词 'hao123' 并打印结果
print('hao123' in driver.page_source)
# True
driver.close() # 关闭浏览器窗口,释放资源
【2】示例
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
import time
# 【1】创建 service 对象 ---> 指定驱动位置
service = Service(executable_path="./chromedriver")
# 【2】创建 option 对象 ---> 给浏览器对象添加额外的参数
options = Options()
# 增加参数
# option.add_argument('--headless') # 设置无窗口模式
# option.add_experimental_option("excludeSwitches", ["enable-automation"]) # 禁止浏览器被监控提示
# option.add_argument("--user-agent=' '") # 设置请求头user-agent
# option.add_argument('--start-maximized') # 设置窗口最大化
# option.add_argument('--window-size=200,200') # 设置窗口大小
# option.add_argument('--incognito') # 无痕模式
# option.add_argument('--hide-scrollbars') # 隐藏滚动条
# option.add_argument('--disable-javascript') # 禁用js
# option.add_argument('--blink-settings=imagesEnabled=false') # 不加载图片(拦截图片)
# option.add_argument('--disable-gpu') # 禁用gpu加速option.add_argument(r'--user-data-dir=C:\Users\v_lihongtao\AppData\Local\Google\Chrome\User Data1') # 打开窗口保存登录态<br><br>prefs = {'profile.default_content_settings.popups': 0, 'download.default_directory': 'd:\\'}<br>option.add_experimental_option('prefs', prefs) # 设置下载文件时的路径
options.add_experimental_option("excludeSwitches", ["enable-automation"])
# options.add_argument('--headless')
# options.add_argument('--start-maximized')
# 【3】创建浏览器对象
browser = Chrome(
service=service,
options=options
)
# 【4】打开浏览器页面
browser.implicitly_wait(3)
browser.get("https://www.baidu.com")
print(browser.page_source)
time.sleep(3)