python模块之selenium详解
- selenium是什么
- selenium安装
- selenium与浏览器的版本匹配
- selenium的简单示例
- 元素的选择及操控
- CSS操作
- frame中元素操作
- 切换窗口
- 弹窗处理
- 鼠标操作
- 键盘操作
- 滚动条操作
- 操作cookie
- 其他
selenium是什么
Selenium是一个用于Web应用程序测试的工具。是爬虫技术的一种重要的模块组件。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera,Edge等。可以通过编写相关脚本,实现对web页面的自动操作,也可以批量获取web页面指定的信息。
selenium安装
windows系统中可以在命令提示符框中,进行安装。
1、打开命令提示符窗口Ctrl+R,键入cmd;
2、输入pip install selenium,回车。
linux系统中也可以执行pip install selenium,来下载。
或访问地址:https://pypi.org/project/selenium/
选择扩展名为gz的源码包进行下载
selenium与浏览器的版本匹配
chromedriver版本 | 支持的Chrome版本 |
v85 | …v85 |
v2.43/2.44 | v69-71 |
v2.42 | v68-70 |
v2.41 | v67-69 |
v2.39/2.40 | v66-68 |
v2.38 | v65-67 |
v2.37 | v64-66 |
v2.36 | v63-65 |
v2.35 | v62-64 |
v2.34 | v61-63 |
v2.33 | v60-62 |
v2.30 | v58-60 |
v2.29 | v56-58 |
v2.28 | v55-57 |
v2.27 | v54-56 |
v2.26 | v53-55 |
selenium的简单示例
from selenium import webdriver
# 创建 WebDriver 对象,指明使用的浏览器驱动
wd = webdriver.Chrome(r'd:\webdrivers\chromedriver.exe')
# 调用get方法,让浏览器打开指定网址
wd.get('https://www.baidu.com')
元素的选择及操控
# 根据元素的id属性选择元素:
wd.find_element_by_id('id')
# 根据元素的name属性选择元素:
wd.find_element_by_name('name')
# 根据元素的class属性选择元素:
wd.find_element_by_class_name('class')
# 根据元素的tag属性选择元素:
wd.find_element_by_tag_name('div')
# 根据元素的text link属性选择元素:
# <a href="http://news.baidu.com" target="_blank" class="mnav">新闻</a>
wd.find_element_by_link_text("新闻")
# 根据元素的partial link text属性选择元素,是text link的一种补充:
wd.find_element_by_partial_link_text("新")
wd.find_element_by_partial_link_text("闻")
# 根据元素的xpath属性选择元素:
wd.find_element_by_xpath("xpath")
# 根据元素的css selector属性选择元素:
wd.find_element_by_css_selector("css")
注:当使用find_element选择的是符合条件的第一个元素,如果没有符合条件的元素,抛出NoSuchElementException异常;使用find_elements选择的是符合条件的所有元素,如果没有符合条件的元素,则返回空列表。
CSS操作
CSS Selector是一个比较强大的工具,可以根据tag名、id属性和class属性来选择元素。
# 通过id属性选择时,需要在前面添加"#"
wd.find_element_by_css_selector('#id')
# 通过class属性选择时,需要在前面添加"."
wd.find_element_by_css_selector('.class')
# 选择指定属性的子元素
wd.find_element_by_css_selector('.class > #id')
# 选择指定属性的后代元素
wd.find_element_by_css_selector('.class #id')
# 通过属性选择元素,比如a标签的属性
wd.find_element_by_css_selector('[href="http://www.baidu.com"]')
# 通过多个属性选择元素
wd.find_element_by_css_selector('div[class=name][id=name]')
# 多组选择(选择id为calss下面的div标签元素,并选择id为classa的元素)
wd.find_elements_by_css_selector('#class > div, #classa')
# 选择span下面的第二个div元素,反之亦然
wd.find_elements_by_css_selector('span > div:nth-child(2)')
wd.find_elements_by_css_selector('span > div:nth-last-child(2)')
# 选择span下面的第二个div类型元素,反之亦然
wd.find_elements_by_css_selector('span > div:nth-of-type(5)')
wd.find_elements_by_css_selector('span > div:nth-last-of-type(5)')
解释下列代码含义:
# 查询div的class属性为aa的子元素span标签id属性为bb的后代元素中,以http开头的href属性
# 下的div标签包括class属性为name且id属性为name的元素(这个有点牵强,依实际情况而定)
wd.find_element_by_css_selector('div.aa > span#bb div[href^="http"] > div[class=name][id=name]')
frame中元素操作
在选择元素时,会发现无法选择frame标签中的元素,这时就可以使用如下代码进行选择。可以理解为frame是被嵌入的一个HTML文档。
# 括号中可以填写frame标签的id、name等属性
wd.switch_to.frame('frame')
# 也可以通过find进行查找,然后再执行其他代码
wd.switch_to.frame(wd.find_element_by_tag_name("iframe"))
# 最后切换回外部的HTML中
wd.switch_to.default_content()
切换窗口
# 设置网址参数
first_url= 'http://www.baidu.com'
second_url='https://www.sina.com.cn'
# 访问百度
wd.get(first_url)
# 访问新浪
wd.get(second_url)
# 返回到百度
wd.back()
wd.quit()
弹窗处理
在实际操作中,我们需要对一些弹窗进行处理,而这个时候,我们的WebDriver对象还是指向旧的窗口,所以无法对新窗口进行操作。对此可以使用Webdriver对象的switch_to属性的 window方法来进行操作。
for handle in wd.window_handles: # 对所有窗口开始循环切换
wd.switch_to.window(handle) # 切换到该窗口
if 'hello' in wd.title: # 判断该窗口的标题栏字符串是不是hello
break # 如果为true,跳出循环
print... # 开始操作弹窗
操作完成后,再次返回旧窗口时,也可以使用以上方法进行切换,或者在操作之前就保留旧窗口,以方便返回。
oldwindow = wd.current_window_handle # 保存当前窗口
# 此处执行新窗口操作
wd.switch_to.window(oldwindow) # 跳回旧窗口
鼠标操作
from selenium.webdriver import ActionChains
click_and_hold(element) 左键点击
context_click(element) 右击
double_click(element) 双击
drag_and_drop(source,target) 拖动
move_to_element(element) 鼠标悬停
# 简单点击
wd.find_element_by_id("id").click()
# 定位到要悬停的元素
above = wd.find_element_by_id("id")
# 对定位到的元素执行悬停操作
ActionChains(wd).move_to_element(above).perform()
# 定位到要操作的元素
dc = wd.find_element_by_id("id")
# 对定位到的元素执行双击操作
ActionChains(wd).double_click(double_click).perorm()
# 定位元素的源位置
source = wd.find_element_by_name("sname")
# 定位元素要移动到的目标位置
target = wd.find_element_by_name("tname")
# 执行元素的拖放操作
ActionChains(wd).drag_and_drop(source,target).perform()
键盘操作
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)
# 全选(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 idlelib import window
# 将页面滚动条拖到底部
jst="document.documentElement.scrollTop=10000"
wd.execute_script(jst)
time.sleep(3)
# 将滚动条移动到页面的顶部
jsd="document.documentElement.scrollTop=0"
wd.execute_script(jsd)
# window.scrollTo(左边距,上边距);
window.scrollTo(0,450);
js=" window.scrollTo(200,1000);"
wd.execute_script(js)
操作cookie
# 获得所有cookie信息
wd.get_cookies()
# 获取指定name的cookie信息
wd.get_cookie(name)
# 添加cookie,应包含name和value值
wd.add_cookie(cookie)
# 删除指定name的cookie信息
wd.delete_cookie(name)
# 删除所有cookie 信息
wd.delete_all_cookies()
其他
# 设置窗口大小
wd.set_window_size(480, 800)
# 隐式等待,10秒钟内只要找到了元素就开始执行,10秒钟后未找到,就超时
# time.sleep(10)表示必须等待10秒
wd.implicitly_wait(10)
# 刷新页面
wd.refresh()
# 文件输入时清除文本
wd.clear()
# 输入一个文本,如hello
wd.find_element_by_id('query').send_keys('hello')
#提交输入框的内容
wd.find_element_by_id('query').submit()
# 获得输入框的尺寸
wd.find_element_by_id('query').size
# 返回页面底部备案信息
wd.find_element_by_id("query").text
#返回元素的属性值,可以是id、name、type 或元素拥有的其它任意属性
wd.find_element_by_id("query").get_attribute('type')
#返回元素的结果是否可见,返回结果为True 或False
wd.find_element_by_id("query").is_displayed()
# 上传文件,定位上传按钮file,添加本地文件
wd.find_element_by_name("file").send_keys('D:\\upload_file.txt')
# 截屏并保存,参数是路径及保存名称
wd.get_screenshot_as_file("D:\\baidu_error.jpg")
# 关闭窗口,close关闭当前页面(窗口),quit:表示退出浏览器
wd.close()
wd.quit()