seleninum 基础及简单实践

news/2024/5/20 20:57:55

网页自动化

1 Selenium自动化基础

1.1 Selenium简介

在这里插入图片描述
Selenium自动化流程如下:

  1. 自动化程序调用Selenium客户端库函数
  2. 客户端库会发送Selenium命令,给浏览器的驱动程序
  3. 浏览器驱动程序接收到命令后,驱动浏览器去执行命令
  4. 浏览器执行命令
  5. 浏览器驱动程序获取命令执行的结果,返回给我们自动化程序
  6. 自动化程序对返回结果进行处理

1.2 Selenium安装
在这里插入图片描述
1)谷歌浏览器驱动
(2)课件提供好的谷歌浏览器和谷歌浏览器驱动软件
注意:谷歌浏览器驱动,要放到python解释器的安装目录下(也就是跟python.exe同一个目录下)

1.3获取某个网页页面

# 导入 webdriver
from selenium import webdriver #创建浏览器对象
driver = webdriver.Chrome(executable_path=r'C:\Users\nlp_1\Desktop\chromedriver\chromedriver-win32\chromedriver.exe')# get方法会一直等到页面被完全加载,然后才会继续程序。
driver.get('https://www.baidu.com')#  打印网页渲染后的源代码
print(driver.page_source)------------------------------------------------------
#  打印页面标题“百度一下,你就知道”
print(Driver.title)# 获取当前url
print(Driver.current_url)# 关闭当前页面,如果只有一个页面,会关闭浏览器
Driver.close()# 关闭浏览器
Driver.quit()

2、Selenium 数据解析提取

2.1 定位元素
Selenium提供了8种定位方式

  1. id
  2. name
  3. class name
  4. tag name
  5. link text
  6. xpath
  7. css selector
  8. partial link text

在这里插入图片描述
单属性查找:

**1.用 标签名 定位查找**
driver.find_element_by_css_selector("input")**2.id 属性定位查找**
driver.find_element_by_css_selector("kw")**3.class 属性定位查找**
driver.find_element_by_css_selector("s_ipt")**4.其他属性定位**
driver.find_element_by_css_selector("[name='wd']")

组合属性查找:

# 1. 标签名及id属性值组合定位
driver.find_element_by_css_selector("input#kw")# 2.  标签名及class属性值组合定位
driver.find_element_by_css_selector("input.s_ipt")# 3. 标签名及属性(含属性值)组合定位
driver.find_element_by_css_selector("input[name='wd']")# 4. 标签及属性名组合定位
driver.find_element_by_css_selector("input[name]")# 5. 多个属性组合定位
driver.find_element_by_css_selector("[class='s_ipt'][name='wd']")

在这里插入图片描述

模糊匹配:

# 1. class拥有多个属性值,只匹配其中一个时
driver.find_element_by_css_selector("input[class ~= "bg"]")# 2. 匹配以字符串开头的属性值
driver.find_element_by_css_selector("input[class ^= "bg"]")# 3. 匹配以字符串结尾的属性值
driver.find_element_by_css_selector("input[class $= "s_btn"]")# 4. 匹配被下划线分隔的属性值
driver.find_element_by_css_selector("input[class |= "s"]")

层级查找:

# 1.直接子元素层级关系,如上图的 百度一下 ,input为span的直接子元素(用 > 表示)
driver.find_element_by_css_selector(".bg.s_btn_wr > input")
# class为bg和s_btn_wr 的span标签的子元素input# 2.只要元素包含在父元素里面,不一定是直接子元素,用空格隔开,如图一所示,form 下面的 span 里面的input
driver.find_element_by_css_selector("#form input")
# id是form的form标签里面的input标签# 3.多级关系
driver.find_element_by_css_selector("#form > span > input")
# id是form的form标签下面的span标签的下面的input标签

2.1.2 多个元素查找

  1. find_elements_by_name 通过元素name定位
  2. find_elements_by_id 通过元素id定位
  3. find_elements_by_xpath 通过xpath表达式定位
  4. find_elements_by_link_text 通过完整超链接定位
  5. find_elements_by_partial_link_text 通过部分链接定位
  6. find_elements_by_tag_name 通过标签定位
  7. find_elements_by_class_name 通过类名进行定位
  8. find_elements_by_css_selector 通过css选择器进行定位

2.1.3 实例演示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.2 获取元素属性

from selenium import webdriver
browser = webdriver.Chrome()
url = 'https://www.baidu.com/'
browser.get(url)
input = browser.find_element_by_id('kw')
print(input)
print(input.get_attribute('name'))
print(input.get_attribute('class'))
print(input.get_attribute('id'))
print(input.get_attribute('maxlength'))
print(input.get_attribute('autocomplete'))
browser.close() 

2.3 获取文本值

Selenium WebDriver 只会与可见元素交互,所以获取隐藏元素的文本总是会返回空字符串。
要获取隐藏元素的文本,这些内容可以使用
element.get_attribute(‘innerHTML’),会返回元素的内部HTML,包含所有的HTML标签。element.get_attribute(‘textContent’),只会得到文本内容,而不会包含HTML。element.get_attribute(‘innerText’),只会得到文本内容,而不会包含HTML标签。

2.4 获取位置,ID,标签名

id
Location
Tag_name
Sizefrom selenium import webdriver
browser = webdriver.Chrome()
url = 'https://www.baidu.com/'
browser.get(url)
logo = browser.find_element_by_xpath('//div[@id="lg"]/img[@class="index-logo-src"]')
print(logo.id)
print(logo.tag_name)
print(logo.location)
print(logo.size) 

在这里插入图片描述

2.5 执行JavaScript

这是一个非常有用的方法,这里就可以直接调用js方法来实现一些操作,
下面的例子是通过登录知乎然后通过js翻到页面底部,并弹框提示from selenium import webdriver
browser = webdriver.Chrome()
browser.get("http://www.zhihu.com/explore")
print(browser.page_source)
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
browser.execute_script('alert("To Bottom")') 

2.6截屏

from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()  #窗口最大化
driver.get(“https://blog.csdn.net/Kwoky/article/details/80285201)
driver.save_screenshot(./images/app2.png”)  #截屏

3 、Selenium自动化交互

3.1 鼠标动作链
在页面上模拟一些鼠标操作,比如双击、右击、拖拽甚至按住不动等,可以通过导入ActionChains类实现。
ActionChains执行原理
(1)当调用ActionChains的方法时不会立即执行,而是会将所有的操作按顺序存放在一个队列里,
(2)当你调用perform()方法时,队列中的时间会依次执行。
有两种写法本质上是一样的,ActionChains会按照顺序执行所有的操作。

#ActionChains方法列表
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) ——移动到距某个元素(左上角坐标)多少距离的位置
perform() ——执行链中的所有动作
release(on_element=None) ——在某个元素位置松开鼠标左键
send_keys(*keys_to_send) ——发送某个键到当前焦点的元素
send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素 

3.2 案例:百度自动化搜索

# 导入 webdriver
from selenium import webdriver
# 调用环境变量指定的 Chrome 浏览器创建浏览器对象
driver = webdriver. Chrome ()
# get 方法会一直等到页面被完全加载,然后才会继续程序,通常测试会在这里选择
time.sleep(2)
driver.get("http://www.baidu.com/") 
# id=“kw”是百度搜索输入框,输入字符串“python”
driver.find_element_by_id(“kw”).send_keys(“python") # id=“su”是百度搜索按钮, click() 是模拟点击
driver.find_element_by_id(“su”).click()
# 获取新的页面快照
driver.save_screenshot(“python1.png”)
# 清除输入框内容
driver.find_element_by_id(“kw”).clear()
print(‘访问成功')

3.3 等待页面加载
Python内置的time库,time.sleep()方法可以强制等待。
Selenium 提供了两种等待方式:
一种是隐式等待,一种是显式等待,隐式等待是等待特定的时间,显式等待是指某一条件直到这个条件成立时继续执行。

显示等待:指定某个条件,然后设置最长等待时间。如果这个时间还没有找到元素,那么便会抛出异常了。如果不写参数,程序默认会0.5s调用一次来查看元素是否已经生成,如果本来元素就是存在的,那么会立即返回。

隐式等待:比较简单,就是简单地设置一个等待时间,单位为秒。如果不设置,默认等待时间为0。通过设定的时长等待页面元素加载完成,再执行下面的代码,如果超过设定时间还未加载完成,则继续执行下面的代码(注意:在设定时间内加载完成则立即执行下面的代码)。

下面是一些内置的等待条件,可以直接调用这些条件,而不用自己写某些等待条件了。 expected_conditions类提供的预期条件判断方法如下。

title_is 标题是某内容
title_contains 标题包含某内容
presence_of_element_located 元素加载出,传入定位元组,如(By.ID, 'p')
visibility_of_element_located 元素可见,传入定位元组
visibility_of 可见,传入元素对象
presence_of_all_elements_located 所有元素加载出
text_to_be_present_in_element 某个元素文本包含某文字
text_to_be_present_in_element_value 某个元素值包含某文字frame_to_be_available_and_switch_to_it frame 加载并切换
invisibility_of_element_located 元素不可见
element_to_be_clickable 元素可点击
staleness_of 判断一个元素是否仍在 DOM,可判断页面是否已经刷新
element_to_be_selected 元素可选择,传元素对象
element_located_to_be_selected 元素可选择,传入定位元组
element_selection_state_to_be 传入元素对象以及状态,相等返回 True,否则返回 False
element_located_selection_state_to_be 传入定位元组以及状态,相等返回 True,否则返回False
alert_is_present 是否出现 Alert 

显示等待
**4 Selenium实战案例**

隐式等待
在这里插入图片描述


https://www.xjx100.cn/news/3091671.html

相关文章

#gStore-weekly | gAnswer源码解析 查询图生成

简介 gAnswer通过将自然语言问题转化成查询图,再和图数据库中的RDF图做匹配以生成用于查询的SPARQL语句。今天讲解的就是生成查询图的主要代码。 // step 2: build query graph (structure construction, relation extraction, top-k join) t System.currentTim…

如何快速让苹果TF上架

苹果TF上架是一个相对复杂的过程,需要经过多个步骤和审核环节。以下是一些建议,可以帮助你快速让苹果TF上架: 确保应用程序符合苹果的审核指南和规则。在提交应用程序之前,仔细阅读苹果的审核指南,并确保你的应用程序…

基于人工水母算法优化概率神经网络PNN的分类预测 - 附代码

基于人工水母算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于人工水母算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于人工水母优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神…

Consumer的负载均衡

想要提高Consumer的处理速度,可以启动多个Consumer并发处理,这个时候就涉及如何在多个Consumer之间负载均衡的问题,接下来结合源码分析Consumer的负载均衡实现。 要做负载均衡,必须知道一些全局信息,也就是一个Consum…

安全+Linux!IBM新一代大型机Z14全新发布

导读本周,以“架构 人机同行”为主题的IBM Systems创行者高峰论坛在北京召开,IBM全球及大中华区硬件系统部负责人,金融、医疗、制造等领域的企业、合作伙伴共与这一年度盛会,探讨认知时代下的基础架构技术趋势及IBM硬件系统业务的…

KT142C语音芯片客户反馈电脑端的配置文件,打开都正常,但是拷贝到KT142C内部就乱码

KT142C语音芯片客户反馈电脑端的配置文件,打开都正常,但是拷贝到KT142C内部就乱码 首先解释一下原理,KT142C内置的330Kbyte空间可供用户下载,实际上拿出程序部分的空间 作为声音存储介质的,也就是说,代码空…

VAD监测(一)

麦克风的采样率是16000,代表一秒钟采集16000个数据点 我们每次拿1024个采样点作为一个buffer,buffer是一个b类型,也就是字节类型。 这一个buffer的长度不一定是1024,取决于每个采样点的采样点的位深度,如果音频数据是…

如果文件已经存在与git本地库中,配置gitignore能否将其从git库中删除

想把项目的前后台代码放到同一个git仓库管理,由于未设置.gitignore,就使用vscode做stage操作(相当于git add . 命令 其中【.】点表示全部文件),观察将要入库的文件发现,node_modules、target、.idea、log等…