selenium知识点整理&汇总

Selenium WEB UI自动化测试支持库的安装及使用

2018-07-17  本文已影响100人  WeiFong

一. 安装部署

1. 客户端selenium库的安装

通过pip安装selenium库的命令:pip install selenium

  • Selenium可支持以下几种语言:java、csharp、python、ruby、php、js、perl
  • 使用国内镜像可提升下载速度:pip install selenium -i https://pypi.douban.com/simple/
  • pip安装出现异常,可尝试更新至最新版本再试,更新pip的命令:python -m pip install --upgrade pip

2. 下载对应浏览器的ChromeDriver驱动:

浏览器 下载地址
Chrome: https://sites.google.com/a/chromium.org/chromedriver/downloadshttp://npm.taobao.org/mirrors/chromedriver/
Edge: https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
Firefox: https://github.com/mozilla/geckodriver/releases
Safari: https://webkit.org/bolg/6900/webdriver-support-in-safari-10/

ChromeDriver驱动版本需与本机已安装浏览器版本一致,下载前可先查看本机浏览器版本,然后下载正确的ChromeDriver驱动

不清楚如何选择对应版本请点我
注意事项:在使用Selenium编写自动化脚本时,需要调用该ChromeDriver,因此ChromeDriver驱动存放路径建议不要出现中文及空格


二.使用Selenium进行WEB UI自动化测试

前言

首先,我们得明白Selenium在整个WEB UI自动化测试中所扮演的角色

  1. 通过ChromeDriver调用浏览器打开需要测试的站点
  2. 定位要操作的元素
    2.1 通过ID定位
    2.2 通过class定位
    2.3 通过标签名定位
    2.4 通过xpath定位
  3. 操作已定位到的元素
    3.1 获取页面内容
    3.2 向选择的元素输入数据
    3.3 点击已定位元素
    3.4 拖拉定位元素
  • 到此处时,Selenium的使命就已经基本完成,后面处理数据及分析数据则由python来完成。

Selenium定位\操作

查找单个元素并返回元素
from selenium import webdriver
driver = webdriver.Chrome(r'd:\tools\webdriver\chromedriver.exe')
driver.get('http://music.baidu.com/top/new')
element = driver.find_element_by_id('songListWrapper')    # 根据ID查找

如果元素未找到则会抛出异常,如果结果有多个,也只返回最先找到的那一个

查找多个元素并返回元素列表
from selenium import webdriver
driver = webdriver.Chrome(r'd:\tools\webdriver\chromedriver.exe')
driver.get('http://music.baidu.com/top/new')
tip_to_taihe_box = driver.find_element_by_class_name('tipToTaihe-box')    #查找单个class元素,如果存在多个只返回第一个
span_list = tip_to_taihe_box.find_elements_by_tag_name('span')    #查找多个span,返回列表

如果元素未找到,会返回一个空列表(不会抛出异常)


查找元素以HTML格式字符串
强制等待
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome(r'd:\tools\webdriver\chromedriver.exe')
driver.get('http://www.baidu.com')
sleep(3)               # 强制等待3秒再执行下一步
element = driver.find_element_by_id('kw')

注意:强制等待,其实就是time.sleep()方法,让程序暂停运行一定时间,时间过后继续运行。缺点:设置的时间太短,元素还没有加载出来同样会报错。设置时间太长,浪费时间,如果代码量大了,就会影响整体的运行速度了,所以尽量少用这个。

隐式等待
from selenium import webdriver
driver = webdriver.Chrome(r'd:\tools\webdriver\chromedriver.exe')
driver.get('http://www.baidu.com')
driver.implicitly_wait(10)      #后面的所有定位元素操作,每半秒进行一次,直到查找到元素,最长等待10秒(可自行定义)
element = driver.find_element_by_id('kw')

注意:隐式等待,是等待页面加载,即页面加载完成后才能执行后面的操作

显式等待
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver = webdriver.Chrome(r'd:\tools\webdriver\chromedriver.exe')
driver.implicitly_wait(10) # 隐式等待和显性等待可以同时用,等待的最长时间取两者之中最大的
driver.get('http://www.baidu.com')
try:    
    element = WebDriverWait(driver, 10).until(
                    EC.presence_of_element_located((By.ID, "kw")))
finally:    
    driver.quit()

注意:显式等待,是等待元素加载,即元素加载完成后就执行对该元素的操作

使用BeautifulSoup4 & html5lib 配合selenium获取到的html内容进行元素定位

使用BeautifulSoup4 & html5lib前必需先通过CMD安装这俩个库,BeautifulSoup4的具体操作,可以查看官方操作说明文档 ( Beautiful Soup 4.2.0 操作说明文档传送门 )

pip install beautifulsoup4    # 安装BeautifulSoup4库
pip install html5lib          # 安装html5lib库

导入BeautifulSoup4 & html5lib

from bs4 import BeautifulSoup
import html5lib

Html5lib如何配合BeautifulSoup4使用

from bs4 import BeautifulSoup
import html5lib
html = """
  <html>
    <head><title>我喜欢的音乐</title></head>
    <body>
      <p class='title'><b>歌曲TOP3</b></p>
      <p class='story'>以下是音乐的下载链接
      <a href='http://music.taihe.com/song/597854185' class='music' id='link1'>明智之举</a>
      <a href='http://music.taihe.com/song/596481670' class='music' id='link2'>如约而至</a>
      <a href='http://music.taihe.com/song/598740690' class='music' id='link3'>只要平凡</a>
      这三首TOP3的歌曲你们喜欢吗?</p>
      <p class='story'>...</p>
    </body>
  </html>
"""
soup = BeautifulSoup(html,'html5lib')    # 将html5lib解释器添加到BeautifulSoup4中
soup.title           # 获取html文档中的title标签元素
soup.title.name      # 获取html文档中的title标签元素的name属性
soup.tltle.text      # 获取html文档中的title标签元素的文本内容

CSS选择元素的方法 tag/id/class

CSS选择器参考手册

根据tag名
p {color:red;}
根据id名
#food {color:red;}
根据class
.vergetable {color:red;}
根据tag名和class组合写(如果多个)
span.vergetable {color:red;}

复选框选择( SELECT )

使用SELECT时需要先导入库

from selenium.webdriver.support.ui import Select
Select 模块(index)定位

通过 select 选项的索引来定位选择对应选项(从 0 开始计数),如选择第二个选项:select_by_index(1)

<select id="cardid" name="CARD">
  <option selected="" value="A">芯片卡</option>
  <option value="B">磁条卡</option>
</select>
Select 模块(value)定位

Select 模块里面除了 index 的方法,还有一个方法,通过选项的 value值来定位。每个选项,都有对应的 value 值:select_by_value(B)

<select id="cardid" name="CARD">
  <option selected="" value="A">芯片卡</option>
  <option value="B">磁条卡</option>
</select>
Select 模块(text)定位

直接通过选项的文本内容来定位,定位“磁条卡”:select_by_visible_text("磁条卡")

<select id="cardid" name="CARD">
  <option selected="" value="A">芯片卡</option>
  <option value="B">磁条卡</option>
</select>
# 导入Select库
from selenium.webdriver.support.ui import Select
# 获取select父元素
s= driver.find_element_by_id('cardid')
# 取消全部选择
select.deselect_all()
# 选择指定文本内容的复选框
select(s).select_by_index(1)    #通过index定位并选择
select(s).select_by_value(B)    #通过value定位并选择
select(s).select_by_visible_text('磁条卡')    #通过text定位并选择

select 里面方法除了上面介绍的三种,还有更多的功能如下
select_by_index() :通过索引定位
select_by_value() :通过 value 值定位
select_by_visible_text() :通过文本值定位
deselect_all() :取消所有选项
deselect_by_index() :取消对应 index 选项
deselect_by_value() :取消对应 value 选项
deselect_by_visible_text() :取消对应文本选项
first_selected_option() :返回第一个选项
all_selected_options() :返回所有的选项

XPath 定位元素方法

特殊定位方法

driver.find_element_by_xpath("//span[contains(text(),'hello')]")      """text值包含匹配"""
driver.find_element_by_xpath("//span[text()='新闻']")                 """text值绝对匹配"""

更多查看:XPath 语法参考手册
selenium使用XPath方法定位元素

from selenium import webdriver
driver = webdriver.Chrome(r'd:\tools\chromedriver.exe')
one_element = driver.find_element_by_xpath('//div[@id="myid"]')    # 单个定位
element_list = driver.find_elements_by_xpath('//div[@class="myclass"]')    # 多个定位(复数形式,返回列表)

end

上一篇下一篇

猜你喜欢

热点阅读