当前位置: 首页 > article >正文

Selenium是广泛使用的模拟浏览器运行的库

简介

Selenium是广泛使用的模拟浏览器运行的库,它是一个用于Web应用程序测试的工具。 Selenium测试直接运行在浏览器中,就像真正的用户在操作一样,并且支持大多数现代 Web 浏览器。

环境

安装

pip install selenium
下载Chrome驱动
系统环境配置添加驱动所在路径

基础用法

1、页面操作

  1. 初始化浏览器对象
from selenium import webdriver

# Chrome浏览器
browser = webdriver.Chrome()
  1. 访问页面
from selenium import webdriver
import time

# Chrome浏览器
browser = webdriver.Chrome()

# # 指定绝对路径的方式(可选)
# path = r'绝对路径\chromedriver.exe'
# browser = webdriver.Chrome(path)

browser.get("https://www.baidu.com")
  1. 前进后退
from selenium import webdriver
import time

# Chrome浏览器
browser = webdriver.Chrome()

browser.get("https://www.baidu.com")
time.sleep(2)

打开淘宝页面
browser.get('https://www.bilibili.com/')
time.sleep(2)

# 后退到百度页面
browser.back()
time.sleep(2)

# 前进的淘宝页面
browser.forward()
time.sleep(2)

# 关闭浏览器
browser.close()
  1. 获取页面基础属性
# 网页标题
print(browser.title)
# 当前网址
print(browser.current_url)
# 浏览器名称
print(browser.name)
# 网页源码
print(browser.page_source)

2、定位页面元素

属性函数
CLASSfind_element(by=By.CLASS_NAME, value=‘’)
XPATHfind_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 (整个页面所有指定标签 比如value=‘div’)find_element(by=By.TAG_NAME, value=‘’)
CSSfind_element(by=By.CSS_SELECTOR, value=‘’)
IDfind_element(by=By.ID, value=‘’)

from selenium import webdriver
import time
from selenium.webdriver.common.by import By

# Chrome浏览器
browser = webdriver.Chrome()

browser.get("https://www.51kim.com/")
element = browser.find_element(by=By.CLASS_NAME, value="copyright").text
# element=browser.find_element(by=By.ID,value='kw').text
print(element)
time.sleep(2)

# 关闭浏览器
browser.close()
//css
a1 = driver.find_element(By.CSS_SELECTOR,'#livenews-id-1-202301272620081211 > div.media-content > h2 > a').text

//xpath
driver.find_elements(By.XPATH,'//*[@id="livenews-id-1-202301282620082087"]')

3、模拟鼠标操作、模拟键盘操作

操作函数
右击context_click()
双击double_click()
拖拽double_and_drop()
悬停move_to_element()
执行perform()
from selenium import webdriver
import time
from selenium.webdriver.common.by import By
# 模拟鼠标
from selenium.webdriver.common.action_chains import ActionChains


# Chrome浏览器
browser = webdriver.Chrome()

browser.get("https://www.xx.com/")

time.sleep(2)

# 创建 ActionChains 对象
actions = ActionChains(browser)

# 定位
element = browser.find_element(by=By.CLASS_NAME, value="dl_temp")

# 悬停
actions.move_to_element(element).perform()

# 模拟鼠标右键点击
actions.context_click(element).perform()

time.sleep(2)

# 模拟鼠标左键双击
double_click_element = browser.find_element(by=By.CLASS_NAME, value="dl_temp")
actions.double_click(double_click_element).perform()
time.sleep(2)

## 模拟拖拽元素
# source_element = browser.find_element(By.ID, "source-id")
# target_element = browser.find_element(By.ID, "target-id")
# actions.drag_and_drop(source_element, target_element).perform()

time.sleep(2)

# 关闭浏览器
browser.quit()
move_to_element() 方法用于将鼠标移动到指定的 Web 元素上。
context_click() 方法用于模拟鼠标右键点击。
double_click() 方法用于模拟鼠标左键双击。
drag_and_drop() 方法用于模拟从一个元素到另一个元素的拖拽动作。

模拟键盘操作

# 创建 ActionChains 对象
actions = ActionChains(driver)

# 查找输入框元素并发送文本
input_element = driver.find_element(By.ID, "input-id")
input_element.send_keys("Hello World")

# 模拟按下回车键
input_element.send_keys(Keys.RETURN)

# 模拟组合键(Ctrl + A)
actions.key_down(Keys.CONTROL).send_keys('a').key_up(Keys.CONTROL).perform()

# 模拟组合键(Ctrl + C)复制
actions.key_down(Keys.CONTROL).send_keys('c').key_up(Keys.CONTROL).perform()

# 移动到另一个输入框并粘贴(Ctrl + V)
another_input_element = driver.find_element(By.ID, "another-input-id")
another_input_element.click()
actions.key_down(Keys.CONTROL).send_keys('v').key_up(Keys.CONTROL).perform()

pip install pyautogui
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’)
键盘F1send_keys(Keys.F1)
import pyautogui
import time

# 等待3秒,以便你有时间切换到想要输入的应用程序窗口
time.sleep(3)

# 输入字符串
pyautogui.write('Hello World', interval=0.1)  # interval参数设置每个字符之间的间隔时间

# 模拟按下回车键
pyautogui.press('enter')

# 模拟组合键(Ctrl + A)
pyautogui.hotkey('ctrl', 'a')

# 模拟组合键(Ctrl + C)复制
pyautogui.hotkey('ctrl', 'c')

# 模拟组合键(Ctrl + V)粘贴
pyautogui.hotkey('ctrl', 'v')

4、延时等待

强制等待:就很简单了,直接time.sleep(n)强制等待n秒

隐式等待:implicitly_wait()设置等待时间,如果到时间有元素节点没有加载出来,就会抛出异常

显式等待:

5、对Cookie操作

# 启动浏览器驱动,这里以 Chrome 为例
driver = webdriver.Chrome()

# 打开目标网站
driver.get('https://xxxxx.com')

# 添加一个Cookie到当前页面会话中
cookie = {'name': 'example_cookie', 'value': 'example_value'}
driver.add_cookie(cookie)

# 访问另一个页面或刷新当前页面以使新添加的Cookie生效
driver.refresh()
# 获取所有Cookies  集合
all_cookies = driver.get_cookies()

# 获取特定名称的Cookie 也就是
# next() 函数用于从生成器中获取下一个项。如果生成器中有匹配的项,next() 将返回第一个满足条件的 Cookie 对象;如果没有找到任何匹配项,那么第二个参数 None 就会被返回,作为默认值。
specific_cookie = next((c for c in all_cookies if c['name'] == 'example_cookie'), None)
# 删除特定名称的Cookie
driver.delete_cookie('example_cookie')

# 删除所有Cookies
driver.delete_all_cookies()

6、execute_script方法

def is_element_exist(browser,xpath):
    try:
        element=browser.find_element(by=By.XPATH,value=xpath)
        flag=True
    except:
        flag=False
    return flag
x = 1000
y = 1000

while True:
    # 执行JavaScript来设置滚动位置
    js = "var q=document.getElementsByClassName('cdk-virtual-scroll-viewport')[0].scrollTop={}".format(x)
    # 允许你在当前浏览器会话中执行任意的 JavaScript 代码
    browser.execute_script(js)  # 修正拼写错误
    time.sleep(0.5)  # 等待页面加载新内容

    x += y

    # 获取当前滚动高度
    check_height = browser.execute_script("return document.getElementsByClassName('cdk-virtual-scroll-viewport')[0].scrollTop;")

    # 如果滚动高度没有变化,说明已经到达底部或没有更多可加载的内容
    if check_height == temp_height:  # 修正比较运算符
        break

    temp_height = check_height  # 更新临时高度
# 需要定位的元素是动态元素,或者我们不确定它在哪时,可以先找到这个元素然后再使用JS操作

# 要查找的 HTML 元素的 id 属性值
target = driver.find_element_by_id('id')

# arguments[0]:这是 execute_script 方法的第一个额外参数(即 target)
driver.execute_script("arguments[0].scrollIntoView();", target)
参数 "arguments[0].scrollIntoView();":这是一个 JavaScript 语句,调用了 scrollIntoView() 方法。arguments[0] 是一个特殊的数组,包含了传递给 execute_script 方法的所有额外参数,在这里它引用了 target WebElement。


参数 target:这是传递给 execute_script 方法的第二个参数,即前面找到的那个 WebElement 对象。execute_script 方法会将这个 WebElement 对象作为 arguments[0] 传递给 JavaScript 代码,从而使得 scrollIntoView() 方法作用于该元素。

7、xpath方法

表达式描述
nodename选取此节点的所有子节点(div)
/从根节点选取
//选择任意位置的某个节点
.选取当前节点
选取当前节点的父节点
@选取属性


通配符描述
*匹配任何元素节点
@*匹配任何属性节点
node()匹配任何类型节点
# 查找具有文本 "登录" 的按钮元素
//button[text()="登录"]

# 模糊定位
//button[contains(text(),“登录”)]//button[contains(@class,“btn”)]
# id是以login-开头的
//input[starts-with(@id,“login-)]//input[ends-with(@id,“ogin-email”)]

# 根据一个元素的多个属性进行定位 name和datatype是属性
//input[@name=“phone” and @datatype=“m”] 

轴定位

描述表达式
定位当前节点后的所有节点//标签名[@属性=属性值]/follow::标签名[@属性=属性值]
定位同一节点后的所有同级节点//标签名[@属性=属性值]/follow-sibling::标签名[@属性=属性值]
定位当前节点的所有子节点//标签名[@属性=属性值]/child::标签名[@属性=属性值]
定位当前节点前的所有节点//标签名[@属性=属性值]/preceding::标签名[@属性=属性值]
定位同一个节点前的所有同级节点//标签名[@属性=属性值]/preceding-sibling::标签名[@属性=属性值]
定位当前节点的所有父节点//标签名[@属性=属性值]/parent::标签名[@属性=属性值]
定位当前节点的所有祖父节点//标签名[@属性=属性值]/ancestor::标签名[@属性=属性值]
xpath='//span[text()=''/ancestor::div[3]/check-box]'
element=browser.find_element(by=By.XPATH,value=xpath)
//span[text()='']: 选择所有文本内容为空的<span>元素。
/ancestor::div[3]: 从选定的<span>元素向上查找其第三个祖先<div>元素。
/check-box: 从选定的第3个祖先<div>元素中选择<check-box>元素。

8、


http://www.kler.cn/a/428994.html

相关文章:

  • 【深度学习】Huber Loss详解
  • 【机器学习实战入门】基于深度学习的乳腺癌分类
  • STL—stack与queue
  • 快手极速版如何查找ip归属地?怎么关掉
  • python mysql库的三个库mysqlclient mysql-connector-python pymysql如何选择,他们之间的区别
  • Kubernetes(k8s)和Docker Compose本质区别
  • 为超越JVM而生?深入理解Kotlin Native的梦想与可能
  • 使用PaddleOCR遇到的问题Bug
  • 机器学习:全面学习路径指南
  • 漫画之家Spring Boot:漫画资源的跨设备访问
  • photoblog解题过程
  • 代码随想录第五十一天
  • 天天 AI-241208:今日热点- OpenAI发布强化微调API,能深度定制超复杂大模型了
  • Linux内核升级操作和 k8s 常见命令
  • Vue3.0中的响应式原理是什么?vue2的响应式原理是什么?
  • LeetCode Hot100 61~70
  • 2024最新qrcode.min.js生成二维码Demo
  • G6基本使用
  • Java项目实战II基于微信小程序的无中介租房系统(开发文档+数据库+源码)
  • Springer Nature——Applied Intelligence 投稿指南
  • JVM学习《垃圾回收算法和垃圾回收器》
  • 知乎Java后台开发面试题及参考答案
  • Vue项目开发 如何实现父组件与子组件数据间的双向绑定?
  • 【innodb阅读笔记】之 索引组织表
  • 工业—使用Flink处理Kafka中的数据_ChangeRecord2
  • rpc-dubbo-多版本