申明:资料来源于网络及书本,通过理解、实践、整理成学习笔记。
安装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
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)
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。
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秒,抛出异常
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
一个坚持学习,坚持成长,坚持分享的人,即使再不聪明,也一定会成为优秀的人!
整理不易,如果看完觉得有所收获的话,记得一键三连哦,谢谢!
下面给大家分享HTML用正则表达式检验表格的实例代码,具体代码内容如下所示: sp...
接触MGR有一段时间了,MySQL 8.0.23的到来,基于MySQL Group Replicaion(MGR)...
前言 写这篇文章的目的是希望像我一样喜欢.net 的人在发布 core到 iis上时少走点...
把图象文件转换成XML格式文件利用.NET 框架下的FromBase64String和ToBase64Strin...
在 Windows 或者 macOS 端 Chrome 浏览器中,无论你当前使用的是浅色还是深色主...
咱们来看看JavaScript中都有哪些操作正则的方法。 RegExp RegExp 是正则表达式的...
最近谷歌发布了Chrome 89新版,带来了一个全新的黑科技实时字幕!顾名思义,这个...
百度UEditor修改右下角统计字数默认只统计前台所见的文字个数,为了便于展示实际...
在Flash Player 10.1及以上版本中,adobe新增了全局错误处理程序UncaughtErrorEv...
【51CTO.com快译】您知道关系型数据库(RDBMS)与NoSQL数据库的本质区别和适用场景...