Python Selenium库的使用【从安装到实战】(二)

简介: Python Selenium库的使用【从安装到实战】

鼠标动作链


有些时候,需要在页面上模拟一些鼠标的操作,比如双击,右击,拖动,甚至按住不懂,这些操作都可以使用ActionChains类来实现


将鼠标移动到 ’换一换‘ 的位置

ac = driver.find_element_by_xpath('//*[@id="hotsearch-refresh-btn"]/span')
ActionChains(driver).move_to_element(ac).perform()

06a66b0ff0b04d56af5202632e3e3263.png移动后’换一换’变蓝说明鼠标已经移动到该位置

20b2e4fa460345ffb78767e113efeb50.png


移动并点击(左)

ac = driver.find_element_by_xpath('//*[@id="hotsearch-refresh-btn"]/span')
# perform() 执行前面的所有动作
# 方式一
ActionChains(driver).move_to_element(ac).click().perform()
# 方式二
ActionChains(driver).click(ac).perform()

双击(左)

方式一
ActionChains(driver).move_to_element(ac).double_click().perform()
方式二
ActionChains(driver).double_click(ac).perform()

右击

# 移动后右击
ActionChains(driver).move_to_element(ac).context_click().perform()
# 直接在该位置右击
ActionChains(driver).context_click(ac).perform()

左键单击并保持

方式1
ActionChains.move_to_element(ac).click_and_hold().perform()
方式2
ActionChains(driver).click_and_hold(ac).perform()

拖动元素

这个百度没有相应的内容,就没有相应的实例

ActionChains.drag_and_drop(ac,ac2).perform()

键盘常用


send_keys(Keys.BACK_SPACE) 删除键(BackSpace)

send_keys(Keys.SPACE) 空格键(Space)

send_keys(Keys.TAB) 制表键(Tab)

send_keys(Keys.ESCAPE) 回退键(Esc)

send_keys(Keys.ENTER) 回车键(Enter)

send_keys(Keys.CONTROL,‘a’) 全选(Ctrl+A)

send_keys(Keys.CONTROL,‘c’) 复制(Ctrl+C)

send_keys(Keys.CONTROL,‘x’) 剪切(Ctrl+X)

send_keys(Keys.CONTROL,‘v’) 粘贴(Ctrl+V)

element.send_keys() # 输入框中输入数据


下拉列表,填充表单


非select元素,鼠标悬浮,以后展现


这里的项目实例是百度首页的设置按钮, 设置 > 搜索设置


733e27f5ab674a12a85aa65c6d673526.png

e018a62efe0b4aefb4ef0522f945d40d.png

小技巧:关于这种悬浮的,无法选择xpath路径的问题,我们只需要在元素中 按 Ctrl+F 然后搜索需要定位的内容,最后复制Xpath路径

399e0b2894c04650820faa249f71c68e.png

主要的思路还是控制自己的鼠标,让鼠标像人一样进行操作

import time
from selenium import webdriver
from selenium.webdriver import ActionChains
driver = webdriver.Chrome(executable_path=r"D:\Python work space\ Reptile\抖音selenium\chromedriver.exe")
driver.get('http://www.baidu.com/')
time.sleep(2)
ac = driver.find_element_by_xpath('//*[@id="s-usersetting-top"]')
ActionChains(driver).move_to_element(ac).perform()  # 移动到设置上面
ac2 =  driver.find_element_by_xpath('//*[@id="s-user-setting-menu"]/div/a[1]')  # 搜索设置的xpath
ActionChains(driver).move_to_element(ac2).click().perform()   # 移动并点击

select元素

因为没有找到就自己写了一个

<!DOCTYPE html>
<html>
<body>
<select id="status">
  <option value="选项一">选项一</option>
  <option value="选项二">选项二</option>
  <option value="选项三">选项三</option>
  <option value="选项四">选项四</option>
</select>
</body>
</html>

这个在发送get请求时,填html文件的路径就可以

from selenium.webdriver.support.ui import Select
# 找到下拉框元素
select = Select(driver.find_element_by_id('status'))
# 选择一个下拉框的元素
select.select_by_index(1)               # 根据索引选择,索引从0开始
select.select_by_value('选项一')         # 根据value进行选择
select.select_by_visible_text('选项三')  # 根据文本内容选择

其他一些常用功能


弹窗处理


常见的弹窗

  • alert:用来提示
  • confirm:用来确认
  • prompt:输入内容

处理弹框的方法

  • driver.switch_to_alert() 这个方法已经被弃用了,会有警告,但是仍然可以使用
  • driver.switch_to.alert 推荐用这个
from selenium import webdriver
driver = webdriver.Chrome(executable_path=r"D:\Python work space\ Reptile\抖音selenium\chromedriver.exe")
driver.get('https://cdn2.byhy.net/files/selenium/test4.html')   #看其他博客找来的网址
driver.find_element_by_xpath('//*[@id="b1"]').click()
s = driver.switch_to.alert
print(s.text)  # 输出弹出框中的文字
s.accept()     # 点击接受
driver.find_element_by_xpath('//*[@id="b2"]').click()
confirm = driver.switch_to.alert
print(confirm.text) # 输出文本
confirm.accept()  # 点击确认
confirm.dismiss()  # 点击取消
driver.find_element_by_id('b3').click()
prompt = driver.switch_to.alert
print(prompt.text)  # 原来输入框中默认的内容
prompt.send_keys("测试成功")   #  向输入框中输入新内容
prompt.accept()
# accept() 接受
# dismiss() 取消
# text() 显示文本
# send_keys() 输入内容


页面切换


一个浏览器会有多个窗口,我们在做测试或者其他内容时也需要进行窗口的切换

打开新窗口以后,窗口

import time
from selenium import webdriver
from selenium.webdriver import ActionChains
driver = webdriver.Chrome(executable_path=r"D:\Python work space\ Reptile\抖音selenium\chromedriver.exe")
driver.get('http://www.baidu.com/')
time.sleep(2)
driver.find_element_by_xpath('//*[@id="s-top-left"]/a[6]').click()
print(driver.window_handles)
# ['CDwindow-B2E0B1FD44171195E4F38465C3AE2168', 'CDwindow-84141EE6D8C06BE4B8A9EBABC999B427']
for i in driver.window_handles:
    print(i)
driver.switch_to.window(driver.window_handles[1])


页面的前进和后退


driver.forward()  # 前进
driver.back()    # 后退


获取页面的Cookies


driver.get_cookies()


获取页面的url


driver.current_url


页面等待


现阶段越来越多的网站使用Ajax技术,异步加载,还有网络环境的问题,会导致网页的加载是不确定性的,如果页面响应时间过长,某个元素还没有被加载出来,就被代码引用这样就会引起异常

为了解决这个问题,selenium提供了两种等待方式,显式等待,隐式等待


固定等待


python自带的time.sleep(),在开发自动化框架的过程中,最忌讳使用time.sleep()方法,虽然可以自定义时间,但是无论网络是否良好,都会按照指定的等待时间进行等待,而在设置停止时间时,也需要要根据最大等待时间设置,这样大大延长了项目的运行效率

我们在开始测试的过程是可以用的,但是最后一定要替换掉


import time
from selenium import webdriver
driver = webdriver.Chrome(executable_path=r"D:\Python work space\ Reptile\抖音selenium\chromedriver.exe")
driver.get('http://www.baidu.com/')
time.sleep(1)
driver.find_element_by_id('kw').send_keys("python")
time.sleep(1)
driver.find_element_by_id('su').click()
time.sleep(1)
driver.quit()

显式等待


显式等待是指指定某一条件,直到这个条件成立以后才能继续执行,需要设置最长等待时间(秒),如果超过这个最长时间还没有找到指定元素就会报错

显示等待需要用WebDriverWait类来实现,是项目中使用较多的方式

两种调用方式
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.wait import WebDriverWait

image.png


一共有两个方法

WebDriverWait.until(method,message)

WebDriverWait.until_not(method,message)


method在等待时间,每隔一段时间调用这个传入的方法

message 如果超时抛出TimeoutException,将message传入异常

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome(executable_path=r"D:\Python work space\ Reptile\抖音selenium\chromedriver.exe")
driver.get('http://www.baidu.com/')
wait = WebDriverWait(driver,2) 
wait.until(EC.title_is("百度一下,你就知道"))  #根据标题是否加载出来判断是否登录
# 这个等待条件还有很多,具体使用哪个可以灵活的换,另外还需要注意返回值
driver.find_element_by_id('kw').send_keys("python")
driver.find_element_by_id('su').click()
driver.quit()


隐式等待


隐式等待就是设置一个最大等待时间(秒),在定位元素时对所有元素设置超时时间,超出时间则抛出异常

隐式等待对整个driver周期都起作用,在最开始设置一次就可以了

缺点:不是很灵活,有些js代码加载很慢,对实际需求也没有帮助,会拖慢效率


from selenium import webdriver
driver = webdriver.Chrome(executable_path=r"D:\Python work space\ Reptile\抖音selenium\chromedriver.exe")
driver.implicitly_wait(10)  # 最长等待时间为10秒
driver.get('http://www.baidu.com/')
driver.find_element_by_id('kw').send_keys("python")
driver.find_element_by_id('su').click()
driver.quit()


网易登录项目实战


d545506bd3c242a2ada8f53ee53b54df.png

分析网易的登录采用了 iframe,又叫浮动帧标记,是内嵌的网页元素,可以将一个html文件嵌入到另一个html文件中显示。这种方法我们不能直接定位里面的元素,需要先切换到iframe里面,

代码如下


import time
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 这一部分是用来伪装浏览器的,避免网站发现
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
chrome_options.add_experimental_option('useAutomationExtension', False)
chrome_options.add_argument('lang=zh-CN,zh,zh-TW,en-US,en')
chrome_options.add_argument("disable-blink-features=AutomationControlled")
driver = webdriver.Chrome(executable_path=r"D:\Python work space\ Reptile\抖音selenium\chromedriver.exe",options=chrome_options)
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
    'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
})
driver.get('https://www.163.com')
wait = WebDriverWait(driver,2) # 显示等待方式一,先声明对象,后判断条件
wait.until(EC.title_is('网易')) 
ActionChains(driver).move_to_element(driver.find_element_by_xpath('//*[@id="js_N_nav_login_title"]')).perform()    # 鼠标移动到登录并悬浮
iframe = driver.find_element_by_xpath('/html/body/div[1]/div[1]/div/div/div/div[2]/div[2]/div[1]/div[1]/div/iframe')
# 显式等待方式二 ,直接一步完成,原理都一样
WebDriverWait(driver,3).until(EC.frame_to_be_available_and_switch_to_it(iframe)) 
# frame_to_be_available_and_switch_to_it判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False
# switch进入iframe两种方式,推荐使用上面的
# iframe = driver.find_element_by_xpath('/html/body/div[1]/div[1]/div/div/div/div[2]/div[2]/div[1]/div[1]/div/iframe')
# wait.until(EC.frame_to_be_available_and_switch_to_it(iframe))
# driver.switch_to.frame(iframe)
user = driver.find_element_by_name('email')
user.send_keys('账号,邮箱')   # 输入自己的邮箱
password = driver.find_element_by_name('password')
# time.sleep(3)
password.send_keys('密码')  # 输入自己的密码
time.sleep(1)   # 可以不要
login = driver.find_element_by_xpath('//*[@id="dologin"]').click()  # 点击登录按键
#退出iframe
driver.switch_to.default_content()  # 退出iframe


要点


  • 伪装浏览器,防止被发现
  • 使用显示等待,避免元素没有加载出来就使用
  • 因为登录页面是用的 iframe,需要先switch to 进入iframe中,然后再定位元素
  • 登录完成以后需要退出iframe


相关文章
|
3天前
|
存储 数据库 时序数据库
InfluxDB的安装与Python调用
InfluxDB是一个高性能的时序数据库(Time-Series Database, TSDB),用于存储和分析时间序列数据的开源数据库,它非常适合于处理大量的时间戳数据,如金融市场数据、IoT 设备数据、监控数据等,尤其适合处理大量的时序数据和高频数据。 主要特性有: • 内置HTTP接口,使用方便 • 数据可以打标记,查询可以很灵活 • 类SQL的查询语句 • 安装管理很简单,并且读写数据很高效 • 能够实时查询,数据在写入时被索引后就能够被立即查出
InfluxDB的安装与Python调用
|
4天前
|
数据采集 算法 数据挖掘
10余位大佬+10余年经验的结晶:Python数据分析与挖掘实战
LinkedIn 对全球超过3.3亿用户的工作经历和技能进行分析后得出,目前最炙手可热的25 项技能中,数据挖掘排名第一。那么数据挖掘是什么? 数据挖掘是从大量数据(包括文本)中挖掘出隐含的、先前未知的、对决策有潜在价值的关系、模式和趋势,并用这些知识和规则建立用于决策支持的模型,提供预测性决策支持的方法、工具和过程。数据挖掘有助于企业发现业务的趋势,揭示已知的事实,预测未知的结果,因此“数据挖掘”已成为企业保持竞争力的必要方法。 今天给小伙伴们分享的Python数据分析与数据挖掘手册是10余位数据挖掘领域资深专家和科研人员,10余年大数据挖掘咨询与实施经验结晶。从数据挖掘的应用出发,以电力、
10余位大佬+10余年经验的结晶:Python数据分析与挖掘实战
|
3天前
|
数据采集 算法 数据挖掘
10余位大佬+10余年经验的结晶:Python数据分析与挖掘实战
LinkedIn 对全球超过3.3亿用户的工作经历和技能进行分析后得出,目前最炙手可热的25 项技能中,数据挖掘排名第一。那么数据挖掘是什么? 数据挖掘是从大量数据(包括文本)中挖掘出隐含的、先前未知的、对决策有潜在价值的关系、模式和趋势,并用这些知识和规则建立用于决策支持的模型,提供预测性决策支持的方法、工具和过程。数据挖掘有助于企业发现业务的趋势,揭示已知的事实,预测未知的结果,因此“数据挖掘”已成为企业保持竞争力的必要方法。 今天给小伙伴们分享的Python数据分析与数据挖掘手册是10余位数据挖掘领域资深专家和科研人员,10余年大数据挖掘咨询与实施经验结晶。从数据挖掘的应用出发,以电力、
|
3天前
|
存储 JSON API
Pydantic:目前最流行的Python数据验证库
在处理来自系统外部的数据,如API、终端用户输入或其他来源时,我们必须牢记开发中的一条基本原则:“永远不要相信用户的输入”。 因此,我们必须对这些数据进行严格的检查和验证,确保它们被适当地格式化和标准化。这样做的目的是为了确保这些数据符合我们的程序所需的输入规范,从而保障项目能够正确且高效地运行。
|
4天前
|
存储 缓存 索引
Python中的NumPy库详解
Python中的NumPy库详解
|
4天前
|
Python
Mac安装Python3.12开发环境
Mac安装Python3.12开发环境
21 2
|
5天前
|
运维 Devops 测试技术
一个人活成一个团队:python的django项目devops实战
DevOps通过自动化的流程,使得构建、测试、发布软件能够更加地快捷、频繁和可靠。本文通过一个python的django个人博客应用进行了DevOps的实战,通过DevOps拉通开发和运维,通过应用云效的DevOps平台实现自动化“软件交付”的流程,使得构建、测试、发布软件能够更加地快捷、频繁和可靠,提交研发交付效率。作为个人项目也是可以应用devops提高效率。
18 3
|
5天前
|
Web App开发 数据采集 测试技术
五分钟轻松掌握 Python 自动化测试 Selenium
本文主要介绍了 Selenium 相关内容,主要涉及 Selenium 知识面,从开始的 Python 小案例,到后面的 API 全面了解,以及 Selenium 的常用功能,到最后的 XPATH 以及爬虫的认知。这些内容已经能够全面,且具有实践性。
|
5天前
|
Linux 网络安全 Python
Linux离线安装Python时ssh和hashlib死活安装不上的解决方案
本文提供了Linux环境下离线安装Python时遇到的"ImportError: No module named _ssl"和"ERROR:root:code for hash md5|sha1|sha224|sha256|sha384|sha512 was not found"两个问题的解决方案,通过设置OpenSSL环境变量和编辑Python源码配置文件来解决。
9 1
|
8天前
|
Web App开发 IDE 测试技术
天呐!当揭开 Selenium 自动化测试框架的神秘面纱,设计与实现令人瞠目!
【8月更文挑战第12天】Selenium 是一强大自动化测试框架,用于Web应用测试。它含WebDriver、IDE和Grid等工具,支持Chrome、Firefox等浏览器。可通过编程模拟用户交互验证应用功能。例如使用Python结合Selenium WebDriver编写自动化测试脚本,实现打开网页、操作元素及断言等功能。还可结合测试框架和Selenium Grid提升测试效率和并行执行能力。
20 1