申明:资料来源于网络及书本,通过理解、实践、整理成学习笔记。
测试环境搭建
-
安装python;
下载地址(https://www.python.org/)
安装成功之后打开cmd输入如下代码显示python安装成功C:\Users\1>python Python 3.9.2 (tags/v3.9.2:1a79785, Feb 19 2021, 13:44:55) [MSC v.1928 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information.
-
安装pip;
安装成功之后打开cmd输入如下代码显示pip安装成功C:\Users\1>pip -V pip 20.2.3 from d:\python\lib\site-packages\pip (python 3.9)
-
安装Selenium;
打开cmd输入如下代码显示pip安装成功C:\Users\1>pip install selenium Collecting selenium Downloading selenium-3.141.0-py2.py3-none-any.whl (904 kB) |████████████████████████████████| 904 kB 16 kB/s Collecting urllib3 Downloading urllib3-1.26.4-py2.py3-none-any.whl (153 kB) |████████████████████████████████| 153 kB 2.0 kB/s Installing collected packages: urllib3, selenium Successfully installed selenium-3.141.0 urllib3-1.26.4 WARNING: You are using pip version 20.2.3; however, version 21.0.1 is available. You should consider upgrading via the 'd:\python\python.exe -m pip install --upgrade pip' command.
-
下载浏览器驱动放到python文件夹下
谷歌浏览器驱动:https://npm.taobao.org/mirrors/chromedriver/
火狐浏览器驱动:https://npm.taobao.org/mirrors/geckodriver/
IE浏览器驱动:http://selenium-release.storage.googleapis.com/index.html
自动化访问百度
-
*防止乱码,支持中文(必要)
# coding=utf-8
-
*导入Selenium的WebDriver包(必要)
from selenium import webdriver
-
*获取浏览器对象(必要)
driver = webdriver.Chrome() #获取谷歌浏览器 #driver = webdriver.Firefox() #获取火狐浏览器 #driver = webdriver.Ie() #获取IE浏览器
-
*向浏览器发送网址(URL)
# 向浏览器输入百度的网址 driver.get("https://www.baidu.com")
定位元素
=以下实例都以百度网站为例=
-
id定位
find_element_by_id()# 使用id定位百度搜索框 driver.find_element_by_id("kw")
-
name定位
find_element_by_name()# 使用name定位百度搜索框 driver.find_element_by_name("wd")
-
class定位
find_element_by_class_name()# 使用class定位百度搜索框 driver.find_element_by_class_name("s_ipt")
-
tag定位
find_element_by_tag_name()driver.find_element_by_tag_name("")
-
link定位:定位文本链接,使用link通过元素标签对之间的文本信息来定位元素
find_element_by_link_text()# 使用link定位百度搜索框上的百度新闻 driver.find_element_by_link_text("新闻")
-
partial link定位:parial link定位是对link定位的一种补充,有些文本链接会比较长,这个时候我们可以取文本链接的一部分定位,只要这一部分信息可以唯一地标识这个链接。
find_element_by_partial_link_text()# 使用partial link定位百度搜索框上的百度新闻 driver.find_element_by_partial_link_text("新")
-
XPath定位:元素的路径定位
find_element_by_xpath()# 使用XPath定位百度搜索框 driver.find_element_by_xpath("//*[@id=\"kw\"]")
-
CSS定位:可较为灵活的选择控件的任意属性,一般情况定位速度比Xpath快
find_element_by_css_selector()# 使用CSS定位百度搜索框 driver.find_element_by_css_selector("#kw")
选择器 例子 描述 .class .intro class选择器,选择class="intro"的所有元素 #id #firstname id选择器,选择id="firstname"的所有元素 * * 选择所有元素 lement p 所有 <p>
元素lement>element div>input 选择元素为 元素之后的所有元素lement+element div+input 选择同一级中紧接在 元素之后的所有元素attribute=value] [target=_blank] 选择
控制浏览器
-
控制浏览器窗口大小
# 设置浏览器宽1920、高1080显示 driver.set_windows_size(1920,1080)
-
控制浏览器全屏显示
driver.maximize_window()
-
控制浏览器后退
driver.back()
-
控制浏览器前进
driver.forward()
-
模拟浏览器刷新
driver.refresh()
-
退出并关闭浏览器及相关的驱动程序
driver.quit()
简单元素操作
-
单击元素
click()# 定位百度搜索框,输入周星驰 driver.find_element_by_id("kw").send_keys("周星驰") # 定位百度一下的搜索按钮并点击 driver.find_element_by_id("su").click()
-
模拟按键输入
*send_keys(value)# 定位百度搜索框,输入周星驰 driver.find_element_by_id("kw").send_keys("周星驰")
-
清除文本
clear()# 定位百度搜索框,清除输入框的内容 driver.find_element_by_id("kw").clear()
-
提交表单,模拟“回车”操作,可以用来提交搜索框的内容、提交按钮
submit()# 定位百度搜索框,输入周星驰 driver.find_element_by_id("kw").send_keys("周星驰") # 提交表单,开始搜索 driver.find_element_by_id("kw").submit()
-
获取元素的尺寸
size# 获取百度搜索框的尺寸 print(driver.find_element_by_id("kw").size) 执行结果: {'height': 44, 'width': 548}
-
获取元素的文本文字
text# 获取百度页面底部备案信息的文本 print(driver.find_element_by_css_selector("#bottom_layer > div > p:nth-child(8) > a").text) 执行结果: 京公网安备11000002000001号
-
获取元素任意属性的属性值
get_attribute(name)# 获取百度搜索框type属性和class属性的属性值 print(driver.find_element_by_id("kw").get_attribute('name')) print(driver.find_element_by_id("kw").get_attribute('id')) 执行结果: wd kw
-
获取该元素是否可见
is_displayed()# 获取百度搜索框是否可见 print(driver.find_element_by_id("kw").is_displayed()) 执行结果: true
鼠标事件
- 导入提供鼠标操作的ActionChains类
from selenium.webdriver import ActionChains
ActionChains(driver):调用ActionChains类,将浏览器驱动driver作为参数传入。
perform():执行所有ActionChains中存储的行为,可以理解成是对整个操作的提交动作。
-
鼠标右击
context_click()方法用于模拟鼠标右键操作,在调用时需要指定元素定位。# 定位需要右击的位置 right_click = driver.find_element_by_id("lg") # 对定位的位置进行鼠标右击操作 ActionChains(driver).context_click(right_click).perform()
-
鼠标悬停
move_to_element()方法可以模拟鼠标悬停的动作,在调用时需要指定元素定位。# 定位到百度上方的“更多”导航栏上 above = driver.find_element_by_css_selector("#s-top-left > div > a") # 在导航栏“更多”上进行鼠标悬浮操作 ActionChains(driver).move_to_element(above).perform()
-
鼠标双击
double_click()方法可以模拟鼠标双击的动作,在调用时需要指定元素定位。# 定位到百度上方的“更多”导航栏上 double_click = driver.find_element_by_css_selector("#s-top-left > div > a") # 在导航栏“更多”上进行鼠标双击操作,打开两个百度产品大全 ActionChains(driver).double_click(double_click).perform()
-
鼠标拖放
drag_and_drop(element, target)在源元素上按住鼠标左键,然后移动到目标元素上释放。element = driver.find_element_by_id("xxx") target = driver.find_element_by_id("xxx") ActionChains(driver).drag_and_drop(element, target).perform()
键盘事件
-
导入提供键盘操作的Keys模块
from selenium.webdriver.common.keys import Keys
-
删除键(BackSpace)
send_keys(Keys.BACK_SPACE)
-
空格键(Space)
send_keys(Keys.SPACE)
-
制表键(Tab)
send_keys(Keys.TAB)
-
回退键(Esc)
send_keys(Keys.ESCAPE)
-
回车键(Enter)
send_keys(Keys.ENTER)
-
Shift键
send_keys(Keys.SHIFT)
-
全选(Ctrl+A)
send_keys(Keys.CONTROL, 'a')
-
复制(Ctrl+C)
send_keys(Keys.CONTROL, 'c')
-
剪切(Ctrl+X)
send_keys(Keys.CONTROL, 'x')
-
粘贴(Ctrl+V)
send_keys(Keys.CONTROL, 'v')
-
键盘F1
send_keys(Keys.F1)
QQ邮箱登录
- 程序代码
from selenium import webdriver # from selenium.webdriver import ActionChains # from selenium.webdriver.common.keys import Keys import time driver = webdriver.Chrome() driver.get("https://mail.qq.com/") print("==========登录前==========") # 打印当前页面title currentTitle = driver.title print(currentTitle) # 打印当前页面URL currentURL = driver.current_url print(currentURL) # 定位login_frame driver.switch_to.frame("login_frame") # 执行QQ邮箱登录 driver.find_element_by_css_selector("#switcher_plogin").click() driver.find_element_by_id("u").clear() driver.find_element_by_id("u").send_keys("1572265659") driver.find_element_by_id("p").clear() driver.find_element_by_id("p").send_keys("QQ密码") driver.find_element_by_id("login_button").click() time.sleep(5) print("==========登录后==========") # 再次打印当前页面title print(driver.title) # 再次打印当前页面URL print(driver.current_url) if driver.title != currentTitle and driver.current_url != currentURL: print("==========登录成功==========") else: print("==========登录失败==========")
- 执行结果
D:\Python\python.exe E:/Python/Automate/BaiduLogin.py ==========登录前========== 登录QQ邮箱 https://mail.qq.com/ ==========登录后========== QQ邮箱 https://mail.qq.com/cgi-bin/frame_html?sid=XeatV4kpGK7GH0Ii&r=a2ece68ab7413801f5498383904acee3 ==========登录成功==========
设置元素等待
WebDriver 提供了两种类型的等待:显式等待和隐式等待。
显式等待
显式等待使 WebdDriver等待某个条件成立时继续执行,否则在达到最大时长时抛弃超时异常(TimeoutException) 。
-
导入By类
from selenium.webdriver.common.by import By
-
导入WebDriverWait类
from selenium.webdriver.support.ui import WebDriverWait
-
导入expected_conditions类
from selenium.webdriver.support import expected_conditions as EC
-
显式等待实例
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get("http://www.baidu.com") element = WebDriverWait(driver, 5, 0.5) .until(EC.presence_of_element_located((By.ID, "kw"))) print(element) driver.quit()
WebDriverWait(driver=driver, timeout=5, poll_frequency=0.5, ignored_exceptions=None) WebDriverWait参数: driver:浏览器驱动 timeout:最长超时时间,默认单位为秒 poll_frequency:检测的间隔(步长)时间,默认为0.5s ignored_exceptions:超时后的异常信息,默认情况下抛 NoSuchElementException异常。 until(method=EC.presence_of_element_located((By.ID, "kw")),message=None) 调用until()方法提供的驱动程序作为一个参数,直到返回值为True presence_of_element_located()方法判断元素是否存在。 until_not(method=EC.presence_of_element_located((By.ID, "kw")),message=None) 调用until_not()方法提供的驱动程序作为一个参数,直到返回值为False presence_of_element_located()方法判断元素是否存在。
隐式等待
隐式等待是通过一定的时长等待页面上某元素加载完成。如果超出了设置的时长元素还没有被加载,则抛出 NoSuchElementException异常。WebDriver 提供了implicitly_wait()方法来实现隐式等待,默认设置为0。
- 导入NoSuchElementException类
from selenium.common.exceptions import NoSuchElementException
- 隐式等待实例
from selenium.common.exceptions import NoSuchElementException
from time import ctime
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
try:
print(ctime())
driver.find_element_by_id("kw").send_keys("周星驰")
# driver.find_element_by_id("kw111").send_keys("周星驰")
except NoSuchElementException as e:
print(e)
finally:
print(ctime())
driver.quit()
如果代码是driver.find_element_by_id("kw").send_keys("周星驰")
执行结果为:
Sun Apr 4 15:15:33 2021
Sun Apr 4 15:15:33 2021
如果代码是driver.find_element_by_id("kw111").send_keys("周星驰")
执行结果为:
Sun Apr 4 15:17:30 2021
Message: no such element: Unable to locate element:
{"method":"css selector","selector":"[id="kw111"]"}
(Session info: chrome=89.0.4389.114)
Sun Apr 4 15:17:40 2021
结论:
如果代码能正常执行,则不影响脚本的执行速度
如果代码不能正常执行,则会等待10秒,抛出异常
expected_conditions类
-
title_is
判断当前页面的标题是否等于预期 -
title_contains
判断当前页面的标题是否包含预期字符串 -
presence_of_element_located
判断元素是否被加在 DOM树里,并不代表该元素一定可见 -
visibilitiy_of_element_located
判断元素是否可见(可见代表元素非隐藏,并且元素的宽和高都不等于0) -
visibilitiy_of
与上一个方法作用相同,只是上一个方法参数为定位,该方法接收的参数为定位后的元素 -
presence_of_all_elements_located
判断是否至少有一个元素存在于DOM树中。例如,在个页面中有n个元素的class为“wp”,那么只要有一个存在就返回True -
text_to_be_present_in_element
判断某个元素中的 text是否包含了预期的字符串 -
text_to_be_present_in_element_value
判断某个元素的value属性是否包含了预期的字符串 -
frame_to_be_available_and_switch_to_it
判断该表单是否可以切换进去、如果可以,返回True并且 switch进去,否则返回False -
invisibility_of_element_located
判断某个元素是否不存在于DOM树或不可见 -
element_to_be_clickable
判断元素是否可见并且是可以点击的 -
staleness_of
等到一个元素从 DOM树中移除 -
element_to_be_selected
判断某个元素是否被选中,一般用在下拉列表 -
element_selection_state_to_be
判断某个元素的选中状态是否符合预期 -
element_located_selection_state_to_be
与上一个方法作用相同,只是上一个方法参数为定位后的元素,该方法接收的参数为定位 -
alert_is_present
判断页面上是否存在alert
一个坚持学习,坚持成长,坚持分享的人,即使再不聪明,也一定会成为优秀的人!
整理不易,如果看完觉得有所收获的话,记得一键三连哦,谢谢!