一、ChromeDriver下载与安装
什么是ChromeDriver:
ChromeDriver是一个用于自动化控制和与Google Chrome浏览器进行交互的驱动程序。它是Chrome浏览器的一个开源项目,由Chrome开发团队开发和维护。
ChromeDriver允许开发人员使用编程语言(如Python、Java、C#等)编写脚本,以控制Chrome浏览器的行为。通过ChromeDriver,您可以模拟用户在浏览器中执行的各种操作,例如打开网页、填写表单、点击按钮、滚动页面等。这使得自动化测试和网页数据爬取变得更加简单和高效。
ChromeDriver与特定版本的Chrome浏览器相对应,因此在使用ChromeDriver之前,您需要确保安装与您当前使用的Chrome浏览器版本相匹配的ChromeDriver版本。这样可以确保ChromeDriver能够与浏览器正确地进行通信和控制。
ChromeDriver在自动化测试、网页爬虫、网页截图、性能测试等领域被广泛使用。它为开发人员提供了一种方便的方式来控制和管理Chrome浏览器,以实现各种自动化任务。
需要注意的是,安装和使用ChromeDriver需要一定的技术知识和编程经验。但一旦掌握了基本的使用方法,您就可以充分利用ChromeDriver的功能,提高开发和测试效率。
下载与安装:
查看自己Chrome浏览器版本:
下载对应版本的ChromeDriver
淘宝镜像:https://registry.npmmirror.com/binary.html?path=chromedriver/
官方镜像:https://sites.google.com/a/chromium.org/chromedriver/downloads
安装 chromeDriver
环境变量配置
二、selenium-python安装
pip install -U selenium
-U 就是指定下载最新版本的selenium
控制浏览器
from selenium import webdriver
import time
# 打开浏览器
driver = webdriver.Chrome()
# 访问百度首页
driver.get('https://www.baidu.com/')
# 睡眠10s
time.sleep(10)
# 退出
driver.quit()
浏览器出现 “chrome正受到自动测试软件的控制”
三、浏览器基本操作
1.打开指定的网址
# 访问百度首页
driver.get('https://www.baidu.com/')
2.获取当前页面的url
currentUrl = driver.current_url
print(currentUrl)
3.返回按钮 相对于浏览器后退的 ←
driver.back()
4. 前进按钮 相对于浏览器前进的 →
driver.forward()
5. 刷新页面 类似于按下F5
driver.refresh()
6. 获取当前页面的title
title = driver.title
7. 窗口大小操作
# 常用的窗口操作有设置窗口大小、最大化窗口、最小化窗口、全屏窗口
# 7.1 设置窗口大小
driver.set_window_size(1920,1080)
# 7.2 最大化窗口
driver.maximize_window()
# 7.3 最小化窗口
driver.minimize_window()
# 7.4 全屏窗口 类似于按下F11
driver.fullscreen_window()
8. 退出
driver.quit()
四、元素常用操作
1. send_keys()
# send_keys()方法用于给输入框输入内容。
# 访问百度首页
driver.get('https://www.baidu.com/')
# 定位搜索框
element = driver.find_element(By.ID,'kw')
# 输入值
element.send_keys('csdn官网')
2. click()
click()方法模拟鼠标左键单击操作。
# 定位搜索框
button = driver.find_element(By.ID,'su')
# 点击搜索按钮
button.click()
3. text()
text用于获取元素可见文本,常用于获取指定元素显示的文本内容以对比结果是否符合预期。
element = driver.find_element(By.CSS_SELECTOR, '.title-content-title')
print(element.text) # 获取文本内容并打印
4. clear()
clear()方法用于清空输入框中的内容,在测试中常用于修改表单场景。
# 定位搜索框
element = driver.find_element(By.ID,'kw')
# 输入值
element.send_keys('csdn官网')
time.sleep(2)
element.clear()
5. get_attribute()
get_attribute()用于获取元素的属性值,常用于修改表单时获取后台反显内容。
# 定位搜索框
element = driver.find_element(By.ID,'kw')
# 输入值
element.send_keys('csdn官网')
print(element.get_attribute('name'))
print(element.get_attribute('value'))
6.is_enabled()
is_enabled()用于判断元素是否启用编辑状态,如果元素是可编辑的,则返回true,如果元素不可编辑,则返回false。
不可编辑的元素进行输入内容或选择内容将不成功
element.is_enabled()
7.is_displayed()
is_displayed()用于判断元素是否显示在页面上,有些元素在DOM中能够找到,但不一定显示在页面上,所谓显示在页面上,即可见,有宽度的,如果元素可见,返回true,
如果不可见,返回false,如果使用click()操作不可见元素时,将抛出异常
element.is_displayed()
8.isSelected()
isSelected()用于判断单选框或复选框的状态是否被选中,如果选中返回true,否则返回false
element.isSelected()
9.submit()
submit()方法用于提交一些没有按钮可点击的输入框,比如我们在进行一些搜索时,输入文字后没有点击搜索的按钮,而是直接敲击enter键完成搜索,则可以使用submit()方法模拟此操作
element.submit()
10.find_element 和 find_elements
定位单个元素:find_element(by模块,'属性值')
定位多个元素:find_elements(by模块,'属性值')
find_element方法和find_elements方法的区别:
find_element只返回一个选中的标签,即有多个满足条件的标签值返回第一个。
find_elements返回的是一个列表,可以满足多个满足条件的标签,注意返回的是列表,让要对其中的标签进行操作需要指定列表元素的下标。
异常:
五、定位元素
driver.find_element_by_id() # 通过id属性定位(唯一);常用
driver.find_element_by_xpath() # 通过xpath表达式定位;常用
driver.find_element_by_class_name() # 通过类名定位;常用
driver.find_element_by_name() # 通过name属性定位
driver.find_element_by_tag_name() # 通过标签名定位
driver.find_element_by_css_selector() # 通过css选择器定位
driver.find_element_by_link_text() # 通过链接标签的text类容定位
driver.find_element_by_partial_link_text() # 通过匹配链接标签的text类容定位
定位(By模块定位)
selenium是通过模拟人对浏览器进行操作,既然是模拟人进行操作,那么就需要选择对页面上的哪一个标签进行操作。例如想让Selenium对页面上的登录按钮进行点击,就需要先让Selenium定位到这个按钮,在进行点击操作。
selenium的by模块提供了八种定位方式:
通过from selenium.webdriver.common.by import By导入By模块。
from selenium.webdriver.common.by import By
By.ID # 标签的id属性值进行定位使用
By.NAME # 通过标签的name属性值进行定位使用
By.CLASS_NAME # 通过标签的class属性值进行定位使用
By.LINK_TEXT # 通过标签的标签中文本值进行定位使用
By.PARTIAL_LINK_TEXT # 通过标签的标签中的部分文本值进行定位使用
By.TAG_NAME # 通过标签的标签名进行定位使用
By.XPATH # 通过标签的xpath路径进行定位使用
By.CSS_SELECTOR # 通过标签的css选择器进行定位使用
1.通过ID属性定位: By.ID
通过开发者模式选择可知 百度首页的input框 id为 kw
# 定位搜索框
elment = driver.find_element(By.ID,'kw')
# 输入值
elment.send_keys('csdn官网')
运行后可出现如下效果:
由此我们可以 通过find_element找寻到搜索按钮的 id
# 定位搜索框
button = driver.find_element(By.ID,'su')
# 点击搜索按钮
button.click()
完整例子代码如下:
1.打开浏览器
2.访问百度首页
3.根据ID定位搜索框
4.在输入框输入“csdn官网”
5.根据ID定位搜索按钮
6.点击触发搜索按钮
from selenium import webdriver
from selenium.webdriver.common.by import By
# 打开浏览器
driver = webdriver.Chrome()
# 访问百度首页
driver.get('https://www.baidu.com/')
# 定位搜索框
elment = driver.find_element(By.ID,'kw')
# 输入值
elment.send_keys('csdn官网')
# 定位搜索框
button = driver.find_element(By.ID,'su')
# 点击搜索按钮
button.click()
# 退出
driver.quit()
2.通过name属性定位: By.NAME
通过开发者模式选择可知 百度首页的input框 name为 wd
# 定位搜索框
elment = driver.find_element(By.NAME,'wd')
3.通过class_name属性定位: By.CLASS_NAME
通过开发者模式选择可知 百度首页的input框 name为 wd
# 定位搜索框
elment = driver.find_element(By.NAME,'s_ipt')
# 不能使用复核class_name
4.通过tag name定位: By.TAG_NAME
#tag name,即元素标签名称,如input、p、a、button、span等
elment = driver.find_element(By.TAG_NAME,'input')
5.通过link text定位: By.LINK_TEXT
#此定位方式使用完整匹配可见元素进行匹配,仅适用于链接元素定位.
#即<a href="www.xxx.com“>xxx这样的标签元素,其他元素不能使用.
#如百度首页的新闻、贴吧等链接元素可使用此方式进行定位.
elment = driver.find_element(By.LINK_TEXT,'新闻')
6.通过partial link text定位: By.PARTIAL_LINK_TEXT
#此定位方式于link text一样,都只能作用于链接元素,也使用可见文本进行匹配.
#不同之处在于,link text表示可见文本必须于指定的文本完全一致,才能匹配成功.
#而partial link text只要可见文本中包含指定的文本,则匹配成功.
elment = driver.find_element(By.PARTIAL_LINK_TEXT,'闻')
7.通过css selector定位: By.CSS_SELECTOR
css定位:
选择器 | 例子 | 描述 |
.class | .home | 选择class="home" 的所有元素 |
#id | #kw | 选择id=“kw”的所有元素 |
element | p(html语法中的标签) | 选择所有 元素 |
element,element | div,p | 选择所有 元素 与 元素 |
element element | div p | 选择元素内部的所有 元素 |
element > element | div > p | 选择父元素为的所有 元素 |
element + element | div + p | 选择紧接在元素之后的所有 元素 |
[attribute] | [target] | 选择所有带target属性的所有元素 |
[attribute=value] | [target=blank] | 选择target=‘blank’的所有元素 |
:nth-child(n) | p:nth-child(2) | 选择属于其父元素的第二个子元素的每个 元素 |
element~element | p~ui | 选择前面有 元素的每个元素 |
可以打开浏览器F12 按CTRL+F 唤醒搜索框,按照语法搜索元素,符合的计数会出现在末尾,切换会对元素展现高亮
操作示例:
elment = driver.find_element(By.CSS_SELECTOR,'#kw') #ID选择器
elment = driver.find_element(By.CSS_SELECTOR,'.s_ipt') #.class选择器
elment = driver.find_element(By.CSS_SELECTOR,'div') #element标签选择器
elment = driver.find_element(By.CSS_SELECTOR,'div,span') # 逗号“,”同时选择多个
elment = driver.find_element(By.CSS_SELECTOR,'div span') # 空格 选择指定元素(div) 内部的(跨层级) 某个(span)元素
elment = driver.find_element(By.CSS_SELECTOR,'div>span') # > 选择指定(span)元素 父元素为某个(div)元素
elment = driver.find_element(By.CSS_SELECTOR,'div+span') # > 选择紧接在(div)元素 后的某个(span)元素
elment = driver.find_element(By.CSS_SELECTOR,'[href]') # 选择有href属性的所有元素
elment = driver.find_element(By.CSS_SELECTOR,'input[name="wd"]') # 选择属性name 为 wd 的所有元素
elment = driver.find_element(By.CSS_SELECTOR,'p:nth-child(2)') # 选择属于其父元素的第二个子元素的<p>元素
elment = driver.find_element(By.CSS_SELECTOR,'p:nth-child(2)') # 选择属于其父元素的第二个子元素的<p>元素
elment = driver.find_element(By.CSS_SELECTOR,'p~ui') # 选择前面有<p>元素的每个<ui>元素
8.通过xpath定位: By.XPATH
Xpath定位与css定位方式类似,XPath是XML Path的简称,由于HTML文档本身就是一个标准的XML页面,所以我们可以使用XPath的语法来定位页面元素。
xpath相对路径:
1.查找页面根元素
//
2.查找页面所有input元素
//input
3.查找页面上第N个form元素
//form[1]
4.查找页面上指定第N个form元素内的直接子input元素(只包括form元素的下一级input元素,使用绝对路径表示,单/号):
//form[1]/input
5.查找页面上指定第N个form元素内的直接子input元素(只要包括在form元素下的input元素都算,使用绝对路径表示,双//号):
//form[1]//input
6.查找页面上id为loginForm的form元素:
//form[@id='loginForm']
7.查找页面上具有name属性为username的input元素:
//form[@name='username']
8.查找页面上id为loginForm的form元素下的第一个input元素:
//form[@id='loginForm']/input[1]
9.查找页面具有name属性为contiune并且type属性为button的input元素:
//input[@name='continue'][@type='button']
10.查找页面上id为loginForm的form元素下第4个input元素:
//form[@id='loginForm']/input[4]
xpath绝对路径:
Xpath定位模糊匹配:
1.contains关键字:
//a[contains(@href, ‘logout’)] #寻找页面中href属性值包含有logout这个单词的所有a元素
2.start-with关键字:
//a[starts-with(@name, ‘start)]) #寻找name属性以start开头的a元素。其中@后面的name可以替换成元素的任意其他属性
3.text关键字:
//*[text()=’确定’]
六、三种等待
强制等待:
强制等待,线程休眠一段时间.
time.sleep(5)
隐式等待:
设置一个等待时间,轮训查找元素是否出现,如果没有出现则抛出异常。
dirver.implicitly_wait(1)
隐式等待是全局的等待,所有的element都生效,特殊场景下若element1需要等待10s,element2需要等待15s,那隐式等待设置3s是不可行的
显式等待:
在代码定义等待条件,当条件发生时才继续执行代码
WebDriverWait’配合until()和until_not()方法,根据判断条件进行等待
程序每隔一段时间(默认为0.5秒)进行条件判断,如果条件成立,则执行下一步,否则继续等待,直到超过设置的最大时间