目录
一: 环境搭建:1: 安装Selenium:2: 安装谷歌驱动WebDriver:
二:简单案例:1:打开百度网址3秒后关闭。2:环境变量问题:
三:元素定位:1:案例演示定位2:演示如果出现异常信息3:Xpath定位:1: 相对路径和绝对路径:2: 案例:
4:CSS定位:4.1: CSS定位比Xpath定位的速度更快。4.2: 代码演示:
5: 查询多个元素
四: 元素等待:1: 为什么要设置元素等待?2:显示等待与隐式等待2.1:概念:2.2 : 显示等待的设置:2.3: 隐式等待:
五: 常用的方法和属性:<一>: 浏览器常用的属性和方法:1:属性2: 方法3: 窗口执行4:执行JS代码5:cookie
<二>: 元素常用的属性和方法:1: 模拟鼠标点击2: 输入框填充数据和清空数据3:获取标签的属性
<三>: 行为链(ActionChains):1: 什么是行为链?2:ActionChains使用的步骤:3: 常用的行为链方法:4: 案例:
六:窗口,frame, 警告框:1: 窗口2:frame3:警告框
七:下拉选择框,无界面模式:1: 下拉选择框Select类:常用属性和方法:案例一:单选框:循环选中案例二:多选框:循环选中再取消
2:无界面模式
一: 环境搭建:
1: 安装Selenium:
pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple
2: 安装谷歌驱动WebDriver:
打开谷歌浏览器—>检查—>关于:查看自己的谷歌版本。我的是85版本。 下载匹配的版本:
https://npm.taobao.org/mirrors/chromedriver
解压后,将chromedriver.exe放在我们的项目中。
二:简单案例:
1:打开百度网址3秒后关闭。
import time
from selenium
.webdriver
import Chrome
driver
= Chrome
(executable_path
='./chromedriver')
driver
.get
("http://www.baidu.com")
time
.sleep
(3)
driver
.quit
()
如果想打开windows本地的一个网页:
driver
.get
(r
"file:C:\Users\11737\Desktop\Selenium_project\demo.html")
2:环境变量问题:
解决方案一: 放在本地的python可执行文件同级目录。
1: 右击电脑属性 2:点击高级系统设置 3:点击环境变量 4:选中用户中的path 5: 找到python3.6所在的位置,将chromedriver放入整个目录中。
解决方案二: 放在任意目录,将所在目录加入到环境变量中,不推荐。
三:元素定位:
通过 id 属性定位 : find_element_by_id通过 name 属性定位 : find_element_by_name通过 class 属性定位 : find_element_by_class_name通过标签名定位 : find_element_by_tag_name通过内容定位 a 标签(绝对匹配) : find_element_by_link_text通过内容定位 a 标签(模糊匹配) : find_element_by_partial_link_text
1:案例演示定位
traceback: 可以打印异常的详细信息。
import time
import traceback
from selenium
.webdriver
import Chrome
driver
= Chrome
(executable_path
='./chromedriver')
driver
.get
(r
"file:C:\Users\11737\Desktop\Selenium_project\demo.html")
try:
print(driver
.find_element_by_id
('username'))
driver
.find_element_by_name
('password2')
driver
.find_element_by_class_name
('input-password')
driver
.find_element_by_tag_name
('ul')
driver
.find_element_by_link_text
('标签')
driver
.find_element_by_partial_link_text
('Optimization')
time
.sleep
(3)
except Exception
:
print(traceback
.format_exc
())
finally:
driver
.quit
()
2:演示如果出现异常信息
将username改成username2222,则会找不到报错。 结果:
traceback: 可以打印异常的详细信息。
3:Xpath定位:
1: 相对路径和绝对路径:
绝对路径: 以/开头: 例如: /html/body/form/input相对路径: 以//开头:例如: //form/input定位方法: find_element_by_xpath(“路径”)单个属性: find_element_by_xpath("//input[@type=‘text’]")多个属性:find_element_by_xpath("//input[@type=‘text’ and @name=‘username’]")选择上级元素: find_element_by_xpath("//input/…")选择其中一个元素(默认第一个): find_element_by_xpath("//ul/li")选择其中一个元素(指定第几个):find_element_by_xpath("//ul/li[1]")选择最后一个元素: find_element_by_xpath("//ul/li[last()]")选择倒数第二个元素: find_element_by_xpath("//ul/li[last()-1]") 注意: 括号的下标是从1开始的,不是从0开始。
2: 案例:
from selenium
.webdriver
import Chrome
import traceback
driver
= Chrome
()
driver
.get
(r
'file://C:\Users\11737\Desktop\Selenium_project\test.html')
try:
print(driver
.find_element_by_xpath
('/html/body/form/input'))
print(driver
.find_element_by_xpath
('//div/ul/li'))
print(driver
.find_element_by_xpath
('//form/input[@name="password"]'))
print(driver
.find_element_by_xpath
('//form/input[@name="password2" and @type="text"]'))
print(driver
.find_element_by_xpath
('//li/..'))
print(driver
.find_element_by_xpath
('//ul/li[1]'))
print(driver
.find_element_by_xpath
('//ul/li[last()]'))
print(driver
.find_element_by_xpath
('//ul/li[last()-1]'))
except Exception
:
print(traceback
.format_exc
())
finally:
driver
.quit
()
4:CSS定位:
4.1: CSS定位比Xpath定位的速度更快。
4.2: 代码演示:
from selenium
.webdriver
import Chrome
import traceback
driver
= Chrome
()
driver
.get
(r
'file://C:\Users\11737\Desktop\Selenium_project\test.html')
try:
print(driver
.find_element_by_css_selector
('#username'))
print(driver
.find_element_by_css_selector
('.input-text'))
print(driver
.find_element_by_css_selector
('form'))
print(driver
.find_element_by_css_selector
('input[type="password"]'))
print(driver
.find_element_by_css_selector
('div>ul'))
except Exception
:
print(traceback
.format_exc
())
finally:
driver
.quit
()
5: 查询多个元素
上面三种方式查询多个元素只需要加s。调用这类方法会返回一个列表,如果没有查询任何一个返回空列表。
print(driver
.find_elements_by_id
('username'))
print(driver
.find_elements_by_id
('username222'))
print(driver
.find_elements_by_name
('username'))
print(driver
.find_elements_by_class_name
('input-text'))
print(driver
.find_elements_by_tag_name
('input'))
print(driver
.find_elements_by_link_text
('标签'))
print(driver
.find_elements_by_partial_link_text
('签'))
print(driver
.find_elements_by_xpath
('//form/input'))
print(driver
.find_elements_by_css_selector
('#username'))
print(driver
.find_elements_by_css_selector
('.input-text'))
print(driver
.find_elements_by_css_selector
('form'))
print(driver
.find_elements_by_css_selector
('input[type="password"]'))
print(driver
.find_elements_by_css_selector
('div>ul'))
四: 元素等待:
1: 为什么要设置元素等待?
答: 如果我们要定位某个元素,但是这个元素是浏览器后期经过Ajax请求获取的,如果我们不设置元素等待,那么可能这个元素还不存在时,程序就开始寻找这个元素了,那么就会错过元素,或者找不到元素。
2:显示等待与隐式等待
2.1:概念:
显示等待就是等待指定元素加载完成,就不再等待,所用的时间比较短。如果所有元素都加载完了还没有找到元素,就报错。隐式等待指的是,等待所有页面加载完成之后,再寻找元素,找不到就报错,相比显示等待,所用的时间较长。
2.2 : 显示等待的设置:
from selenium
.webdriver
import Chrome
import traceback
from selenium
.webdriver
.support
.wait
import WebDriverWait
driver
= Chrome
()
driver
.get
(r
'file://C:\Users\11737\Desktop\Selenium_project\test.html')
try:
wait_driver
= WebDriverWait
(driver
, 10, 2)
def temp_func(temp_driver
):
print("我被调用了")
return temp_driver
.find_element_by_tag_name
('html222')
wait_driver
.until
(temp_func
)
except Exception
:
print(traceback
.format_exc
())
finally:
driver
.quit
()
修改成lambda 的格式:
from selenium
.webdriver
import Chrome
import traceback
from selenium
.webdriver
.support
.wait
import WebDriverWait
driver
= Chrome
()
driver
.get
(r
'file://C:\Users\11737\Desktop\Selenium_project\test.html')
try:
wait_driver
= WebDriverWait
(driver
, 10, 2)
wait_driver
.until
(lambda temp_driver
:temp_driver
.find_element_by_tag_name
('html'))
except Exception
:
print(traceback
.format_exc
())
finally:
driver
.quit
()
再次我想等不能进行一下封装,构造一个函数,能够根据传入的指定的查找方式,获取指定的元素对象?
from selenium
.webdriver
import Chrome
import traceback
from selenium
.webdriver
.common
.by
import By
from selenium
.webdriver
.support
.wait
import WebDriverWait
driver
= Chrome
()
driver
.get
(r
'file://C:\Users\11737\Desktop\Selenium_project\test.html')
def find_wait(by
=By
.ID
,value
=None, _t
=10 ):
wait_driver
= WebDriverWait
(driver
, _t
)
el
= wait_driver
.until
(lambda temp_driver
: temp_driver
.find_element
(by
, value
))
return el
try:
el
= find_wait
(By
.ID
, "username")
except Exception
:
print(traceback
.format_exc
())
finally:
driver
.quit
()
2.3: 隐式等待:
from selenium
.webdriver
import Chrome
import traceback
from selenium
.webdriver
.support
.wait
import WebDriverWait
driver
= Chrome
()
driver
.get
(r
'file://C:\Users\11737\Desktop\Selenium_project\test.html')
driver
.implicitly_wait
(10)
try:
driver
.find_element_by_id
('username')
except Exception
:
print(traceback
.format_exc
())
finally:
driver
.quit
()
五: 常用的方法和属性:
<一>: 浏览器常用的属性和方法:
1:属性
import traceback
driver
= Chrome
()
driver
.get
("http://www.baidu.com")
print("浏览器的名字是:", driver
.name
)
print("当前网页的标题是: ", driver
.title
)
print("当前网页的网址是: ", driver
.current_url
)
print("当前网页的源码是: ", driver
.page_source
)
driver
.quit
()
2: 方法
driver
.close
()
driver
.quit
()
driver
.back
()
driver
.forward
()
driver
.refresh
()
driver
.maximize_window
()
driver
.fullscreen_window
()
driver
.minimize_window
()
3: 窗口执行
作用: 代码出错时,对出错时的浏览器内容进行截图。 案例: 打开百度网址,对网址截图:
from selenium
.webdriver
import Chrome
import time
driver
= Chrome
()
driver
.get
("http://www.baidu.com")
driver
.maximize_window
()
driver
.implicitly_wait
(2)
driver
.get_screenshot_as_file
('baidu.png')
time
.sleep
(2)
driver
.quit
()
4:执行JS代码
案例: 访问百度后,弹出警告窗口“哈哈哈,我是警告”
from selenium
.webdriver
import Chrome
import time
driver
= Chrome
()
driver
.get
("http://www.baidu.com")
driver
.maximize_window
()
driver
.implicitly_wait
(2)
driver
.execute_script
("alert('哈哈哈,我是警告')")
time
.sleep
(2)
driver
.quit
()
5:cookie
案例: 进入百度网页,获取所有cookie,获取指定cookie,删除指定cookie,删除所有cookie,添加一个cookie,再次查看所有cookie。
from selenium
.webdriver
import Chrome
import time
driver
= Chrome
()
driver
.get
("http://www.baidu.com")
print(driver
.get_cookies
())
print(driver
.get_cookie
('BD_HOME'))
driver
.add_cookie
({'name': "name", 'value': '善文'})
print(driver
.get_cookie
('name'))
driver
.delete_cookie
('name')
print(driver
.get_cookie
('name'))
driver
.delete_all_cookies
()
print(driver
.get_cookies
())
time
.sleep
(2)
driver
.quit
()
<二>: 元素常用的属性和方法:
1: 模拟鼠标点击
2: 输入框填充数据和清空数据
3:获取标签的属性
案例: 访问百度浏览器,输入框中输入“任善文”,然后清空输入框,再写入“牛牛”,然后打印获取输入框的属性,最后点击搜索。
from selenium
.webdriver
import Chrome
import time
driver
= Chrome
()
driver
.get
("http://www.baidu.com")
el
= driver
.find_element_by_class_name
('s_ipt')
el
.send_keys
("任善文")
time
.sleep
(2)
el
.clear
()
time
.sleep
(2)
el
.send_keys
("牛牛")
el
.click
()
time
.sleep
(2)
time
.sleep
(2)
driver
.quit
()
<三>: 行为链(ActionChains):
1: 什么是行为链?
答:组合多个行为来完成一个目标操作,比如:按下 shift --> 按下 a -->松开 a --> 松开 shift。
2:ActionChains使用的步骤:
实例化ActionChains添加行为(行为链)ActionChains的perform(),执行。
3: 常用的行为链方法:
reset_actions(self) : 清空行为链click(self, on_element=None): 鼠标点击click_and_hold(self, on_element=None) : 鼠标按下release(self, on_element=None) : 松开鼠标context_click(self, on_element=None) : 鼠标右击double_click(self, on_element=None) : 鼠标双击drag_and_drop(self, source, target) : 拖动元素,source 被拖动元素,target 表示被拖动到那个元素中drag_and_drop_by_offset(self, source, xoffset, yoffset) : 拖动元素,给定x,y 轴偏移key_down(self, value, element=None) : 按键按下key_up(self, value, element=None) : 按键松开move_by_offset(self, xoffset, yoffset) : 鼠标箭头移动,给定 x,y 轴偏移move_to_element(self, to_element) : 鼠标移动到某个元素中心move_to_element_with_offset(self, to_element, xoffset, yoffset) : 鼠标移动到元素内的 x,y 轴位置send_keys(self, *keys_to_send): 发送多个按键,也可以是一个字符串send_keys_to_element(self, element, *keys_to_send) :
4: 案例:
要求: 打开百度,在文本框中输入Aa,Aa的输入需要行为链。
from selenium
.webdriver
import Chrome
, ActionChains
import time
from selenium
.webdriver
.common
.keys
import Keys
driver
= Chrome
()
driver
.get
("http://www.baidu.com")
el
= driver
.find_element_by_class_name
('s_ipt')
actions
= ActionChains
(driver
)
actions
.move_to_element
(el
).click
().key_down
(Keys
.SHIFT
).key_down
('a').key_up
(Keys
.SHIFT
).key_down
('a')
actions
.perform
()
time
.sleep
(2)
el2
= driver
.find_element_by_id
('su')
el2
.click
()
time
.sleep
(2)
driver
.quit
()
六:窗口,frame, 警告框:
1: 窗口
案例: 多窗口的切换
from selenium
.webdriver
import Chrome
import time
driver
= Chrome
()
driver
.get
('http://www.baidu.com')
driver
.find_element_by_link_text
('新闻').click
()
print(driver
.window_handles
)
print(driver
.current_window_handle
)
driver
.switch_to
.window
(driver
.window_handles
[1])
print(driver
.current_window_handle
)
time
.sleep
(5)
driver
.switch_to
.window
(driver
.window_handles
[0])
print(driver
.current_window_handle
)
driver
.quit
()
2:frame
frame:HTML页面中的一种框架,主要作用是在当前页面嵌套另一页面页面; (HTML语言中,frame/iframe标签为表单框架)webdriver只能访问一个页面,默认是外层页面,如果要访问嵌套的页面,必须切换当前到嵌套页面中。
案例:QQ邮箱的登录界面是一个页面里面又内嵌了一个frame,frame中的元素才是登录呢,现在要求
from selenium
.webdriver
import Chrome
import time
driver
= Chrome
()
driver
.get
('https://mail.qq.com/')
frame
=driver
.find_element_by_id
('login_frame')
driver
.switch_to
.frame
(frame
)
el
= driver
.find_element_by_id
("switcher_plogin")
el
.click
()
time
.sleep
(3)
driver
.quit
()
3:警告框
案例: 打开百度,弹出警告框,点击接收或者取消。
from selenium
.webdriver
import Chrome
import time
driver
= Chrome
()
driver
.get
('http://www.baidu.com')
driver
.execute_script
("alert('hello')")
time
.sleep
(3)
alert
= driver
.switch_to
.alert
alert
.accept
()
七:下拉选择框,无界面模式:
1: 下拉选择框
Select类:
Select 类是 WebDriver 为解决 select 标签定位诞生的,此类定位的是 select 标签
常用属性和方法:
select.options # select 中所有 options
select.all_selected_options # 所有被选中的 option
select.first_selected_option # 第一个被选中的 option
select.select_by_value(value) # 通过 option 的值选中
select.select_by_index(index) # 通过 option 的下标选中
select.select_by_visible_text(text) # 通过 option 的可见文本选中
select.deselect_all() # 全部不选中
select.deselect_by_value(value) # 通过 option 的值取消选中
select.deselect_by_index(index) # 通过 option 的下标取消选中
select.deselect_by_visible_text(text) # 通过 option 的文本取消选中
案例一:单选框:循环选中
import time
from selenium
.webdriver
.support
.select
import Select
from selenium
.webdriver
import Chrome
driver
= Chrome
()
driver
.get
(r
'file://C:\Users\11737\Desktop\Selenium_project\test.html')
el
= driver
.find_element_by_id
('select-single')
select_single
= Select
(el
)
options
=select_single
.options
for i
in range(len(options
)):
select_single
.select_by_index
(i
)
time
.sleep
(1)
案例二:多选框:循环选中再取消
import time
from selenium
.webdriver
.support
.select
import Select
from selenium
.webdriver
import Chrome
driver
= Chrome
()
driver
.get
(r
'file://C:\Users\11737\Desktop\Selenium_project\test.html')
el
= driver
.find_element_by_id
('select-multiple')
select
= Select
(el
)
options
=select
.options
print(options
)
select
.deselect_all
()
for i
in range(len(options
)):
select
.select_by_index
(i
)
time
.sleep
(1)
select
.deselect_all
()
2:无界面模式
开启无界面模式的方法 1: 实例化配置对象 options = webdriver.ChromeOptions() 2: 配置对象添加开启无界面模式的命令 options.add_argument("–headless") 3: 配置对象添加禁用gpu的命令 options.add_argument("–disable-gpu") 4: 实例化带有配置对象的driver对象 driver = webdriver.Chrome(’./chromedriver’, options=options)
from selenium
import webdriver
options
= webdriver
.ChromeOptions
()
options
.add_argument
("--headless")
options
.add_argument
("--disable-gpu")
driver
= webdriver
.Chrome
(options
=options
)
driver
.get
('https://www.baidu.com')
print(driver
.title
)
driver
.quit
()