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()