1、基础
1)导入webdriver、By类
2)调用webdriver下的Chrome类,创建一个driver对象
3)get方法模拟进入网页
4)元素定位+操作
5)quit方法退出
import time
from selenium import webdriver
# By是selenium中内置的一个class,在这个class中有各种方法来定位元素
from selenium.webdriver.common.by import By
# 调用webdriver模块下的Chrome类
driver = webdriver.Chrome()
# 使用Chrome类提供的get方法
driver.get("https://www.baidu.com")
driver.find_element(By.ID, 'kw').send_keys('九江')
driver.find_element(By.ID, 'su').click()
time.sleep(3)
driver.quit()
2、元素定位
定位总结:
一般 id>name>css>XPath
八种定位方式:
1)ID
2)NAME
3)CLASS_NAME
——若class的值中有空格,则需要借助CSS Selector处理
4)TAG_NAME
5)LINK_TEXT
6)PARTIAL_LINK_TEXT
——有时候一个超链接的文本很长,我们如果全部输入,既麻烦,又显得代码很不美观,这时候我们就可以只截取一部分字符串,进行模糊匹配。
7)XPATH
8)CSS_SELECTOR
定位方法:driver.find_element(By.ID, ‘su’)
XPATH
符号 | 表达式 | 作用 |
---|---|---|
*[@ | //*[@id=“nav”]/ul[1]/li[6]/a | 定位到id="nav"的div标签下面第1个ul标签下的第6个li标签下的a标签 |
*[contains | //*[contains(text(),‘贴吧’)] | 查找文本里包含"新闻"的元素(可替换@id) |
following:: | //*[@id=“head”]//following::input[1] | 查找id="head"元素后标签名为input的第1个元素 |
1、元素属性定位——/标签[@属性=值]
2、逻辑运算符连接多属性定位——/标签[@属性1=值 and 属性2=值]
3、匹配属性中部分字符串——/标签[contains(@属性,值)]
4、匹配显示文本信息——/标签[contains(text(),值)]
CSS_SELECTOR
element = driver.find_element(By.CSS_SELECTOR, ‘su’)
选择器 | 含义 | 例子 |
---|---|---|
id选择器 | 通过 # 来定义,通过元素的id属性来定位 | #kw |
class选择器 | 通过 . 来定义,通过元素的class属性来定位 | .s_ipt |
标签选择器 | 通过标签的名字来定位元素 | input |
属性选择器 | 根据标签中的属性来定位元素, 格式: [属性名=”属性值”],或标签名[属性名=属性值]。如果属性是唯一的,那么标签名可以不用写 | input[id=“kw”] |
↑ | 定位带空格的复合class属性。class属性带空格,如果直接通过class属性定位是会报错的,需要通过css selector按class属性定位 | [class=“s-top-left-new s-isindex-wrap”] |
find_element和find_elements方法
- | find_element | find_elements |
---|---|---|
没有匹配到元素 | 执行报错 | 返回空列表 |
匹配到一个元素 | 返回元素 | 返回包含一个元素的列表 |
匹配到多个元素 | 返回第一个元素 | 返回包含所有匹配元素列表 |
3、常用方法
控制浏览器
driver.set_window_size(宽,高)
driver.maximize_window()
driver.forward()(控制浏览器前进)
driver.back()
driver.refresh()(模拟浏览器刷新)
元素常用方法
element.click()
element.clear()
element.send_keys(值)
element.submit()(模拟提交表单/模拟回车)
鼠标操作
from selenium.webdriver.common.action_chains import ActionChains
AC = ActionChains(driver)
AC.context_click(元素).perform()
AC.double_click(元素).perform()
AC.drag_and_drop(元素1,元素2).perform()(拖动元素1到元素2上)
AC.move_to_element(悬停元素).perform()(鼠标悬停)
键盘操作
from selenium.webdriver.common.keys import Keys as Ky
element.send_keys(Ky.CONTROL, “a”)
element.send_keys(Ky.ENTER)(回车)
element.send_keys(Ky.SPACE)
element.send_keys(Ky.BACK_SPACE)
验证信息(可以做自动化测试的断言点)
title = driver.title(当前页面标题)
now_url = driver.current_url(当前页面url)
元素等待:显式(单个)/隐式(全部)
driver.implicitly_wait(时间)
4、其他
1)表单
实际上就是使用iframe/frame,引用了其他页面的链接,真正的页面数据并没有出现在当前源码中,但是在浏览器中我们看到,简单理解可以使页面中开了一个窗口显示另一个页面。
driver.switch_to.frame(表单元素)(id/name元素)
driver.switch_to.default_content()(回到最外层页面)
2)多窗口
index_handle = driver.current_window_handle(获得该页面句柄)
driver.switch_to.window(index_handle)(进入该句柄页面)
3)警告
4)下拉
5)上传
6)下载
7)Cookie
Cookie内记录用户名和密码(加密)信息,只要请求时服务器收到Cookie,识别成功,默认为已登陆
webdriver操作Cookie的方法有:
操作 | 说明 |
---|---|
get_cookies() | 获得所有Cookie信息(重点) |
add_cookie(cookie_dict) | 添加Cookie,必须有name 和value 值(重点) |
get_cookie(name的属性值) | 返回指定name名称的Cookie信息 |
delete_cookie(name的属性值) | 删除特定(部分)的Cookie信息 |
delete_all_cookies() | 删除所有Cookie信息 |
cookies = driver.get_cookies()
【返回内容-例:[{‘domain’: ‘.baidu.com’,…‘name’: ‘ZFY’,…‘value’: ‘T8r6JI4U3V5PmmuJBQ:Aa8eLjWp8gub8ZMAwX8HWCJi8:C’…},…},{…},{…}…]】
cookie = driver.get_cookie(“name的属性值”)【返回整个{}】
8)滚动条
移动到页面底部
driver.execute_script(“window.scrollTo(0,document.body.scrollHeight)”)
移动到页面顶部
driver.execute_script(“window.scrollTo(document.body.scrollHeight,0)”)
移动到元素element对象的“底端”与当前窗口的“底部”对齐 driver.execute_script(‘arguments[0].scrollIntoView(false);’,element)
移动到元素element对象的“顶端”与当前窗口的“顶部”对齐 driver.execute_script(‘arguments[0].scrollIntoView();’,element)
driver.execute_script(‘arguments[0].scrollIntoView(true);’,element)
9)滑动解锁
① 方法一
AC.click_and_hold(element)(按住)
AC.move_by_offset(100, 0)(向右移动100)
AC.perform()(执行)
time.sleep(5)(用于观察)
AC.release()(释放)
AC.perform()
10)窗口截图
driver.save_screenshot(r"D:\Pictures\123.png")
11)关闭窗口
driver.close()(关闭当前窗口)
driver.quit()(关闭驱动程序及所有窗口)
5、场景
1)新增标签页后,切换句柄(否则无法控制新增页面)
# 新增页面后
time.sleep(10) # 有时需要手动验证
print(driver.window_handles)
driver.switch_to.window(driver.window_handles[1]) # 核心!!!需修改为新增句柄
time.sleep(2)
driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')
2)滑动解锁
# 进入新页面等待
time.sleep(3)
print(driver.window_handles)
# 根据实际修改!
driver.switch_to.window(driver.window_handles[1])
time.sleep(2)
# 错误定位
print(1)
# 定位滑块
element = driver.find_element(By.XPATH, '//div[@class="vcode-spin-control"]/div[@class="vcode-spin-button"]')
print(2)
# 以下为核心!!!
AC.click_and_hold(element)
# 根据实际修改(滑动区域总宽度 - 滑块宽度)
AC.move_by_offset(100, 0)
AC.perform()
# 观察是否滑动
time.sleep(3)
AC.release()
AC.perform()
搭建基础
1、安装selenium
2、下载驱动
selenium是一个自动化测试的工具,说到自动化肯定就离不开网页。所以我们要去下载浏览器的驱动,才能使得我们写的脚本和浏览器兼容。
这里以谷歌浏览器为例(其他浏览器原理一样),点击右上角的三个小点、点击帮助、点击关于Chrome。如下图:

确定浏览器版本,根据浏览器输入网址:
Chrome驱动下载地址http://chromedriver.storage.googleapis.com/index.html
火狐驱动下载地址为:https://github.com/mozilla/geckodriver/releases/
IE驱动的下载地址:https://www.nuget.org/packages/Selenium.WebDriver.IEDriver/
下载好之后找到和版本最接近的安装包,我的谷歌版本是94.0.4606.81,所以我选择最近的94.0.4606.61,点击32位window系统

下载好之后将我们的chromedriver放到和我们python安装路径相同的目录下

配置环境变量
打开我们的查看高级系统设置,点击环境变量,打开系统变量里面的path环境。添加我们的驱动路径进去。

import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("https://www.baidu.com")
browser.find_element_by_id('kw').clear()
browser.find_element_by_id('kw').send_keys('九江')
browser.find_element_by_id('su').click()
time.sleep(20)
browser.quit()