文章目录

  • selenium框架
  • 一、介绍
  • 1.功能
  • 2.优势
  • 3.selenium下载及驱动安装
  • Chrome下载:http://chromedriver.storage.googleapis.com/index.html
  • Firefox安装
  • IE安装:http://selenium-release.storage.googleapis.com/index.html
  • 二、操作浏览器
  • 1.加载配置方式
  • 2.Headless 方式
  • 3.设置浏览器窗口
  • 4.前进后退
  • 三、元素定位
  • 1.根据 id 定位
  • 2.根据 name 定位
  • 3.根据 class 定位
  • 4.根据标签名定位
  • 5.使用 CSS 定位
  • 6.使用链接文本定位超链接
  • 7.使用 xpath 定位
  • 四、等待事件
  • 1.显示等待
  • 2.隐式等待
  • 五、实战练习
  • 1.无界面测试
  • 2.显示界面测试


selenium框架

一、介绍

Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),[Mozilla Firefox](https://baike.baidu.com/item/Mozilla Firefox/3504923),SafariGoogle ChromeOpera,Edge等。这个工具的主要功能包括:测试与浏览器的兼容性——测试应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成.Net、JavaPerl等不同语言的测试脚本。

1.功能

  • 框架底层使用JavaScript模拟真实用户对浏览器进行操作。测试脚本执行时,浏览器自动按照脚本代码做出点击,输入,打开,验证等操作,就像真实用户所做的一样,从终端用户的角度测试应用程序。
  • 使浏览器兼容性测试自动化成为可能,尽管在不同的浏览器上依然有细微的差别。
  • 使用简单,可使用Java,Python等多种语言编写用例脚本。

2.优势

据Selenium主页所说,与其他测试工具相比,使用Selenium的最大好处是:

Selenium测试直接在浏览器中运行,就像真实用户所做的一样。Selenium测试可以在Windows、LinuxMacintosh上的Internet Explorer、Chrome和Firefox中运行。其他测试工具都不能覆盖如此多的平台。使用Selenium和在浏览器中运行测试还有很多其他好处。

Selenium完全开源,对商业用户也没有任何限制,支持分布式,拥有成熟的社区与学习文档

下面是主要的几大好处:

通过编写模仿用户操作的Selenium测试脚本,可以从终端用户的角度来测试应用程序。通过在不同浏览器中运行测试,更容易发现浏览器的不兼容性。Selenium的核心,也称browser bot,是用JavaScript编写的。这使得测试脚本可以在受支持的浏览器中运行。browser bot负责执行从测试脚本接收到的命令,测试脚本要么是用HTML的表布局编写的,要么是使用一种受支持的编程语言编写的。

Selenium 2.0适用于以下浏览器:

  • Google Chrome
  • Internet Explorer 7, 8, 9, 10, 11
  • Firefox
  • Safari
  • Opera
  • Edge
  • HtmlUnit
  • phantomjs
  • Android
  • iOS

Selenium 1.0适用于以下浏览器:

Browser

Selenium IDE

Selenium Remote Control

Selenium Core

Selenium 2/Webdriver API

Firefox 10

Record and playback tests

Start browser, run tests

Run tests

Run tests

Firefox 9

Record and playback tests

Start browser, run tests

Run tests

Run tests

Firefox 8

Record and playback tests

Start browser, run tests

Run tests

Run tests

Firefox 7

Record and playback tests

Start browser, run tests

Run tests

Run tests

Firefox 6

Record and playback tests

Start browser, run tests

Run tests

Run tests

Firefox 5

Record and playback tests

Start browser, run tests

Run tests

Run tests

Firefox 4

Record and playback tests

Start browser, run tests

Run tests

Run tests

Firefox 3.6

Record and playback tests

Start browser, run tests

Run tests

Run tests

Firefox 3

Record and playback tests

Start browser, run tests

Run tests

not supported

IE 9

not supported

Start browser, run tests

Run tests

Run tests

IE 8

not supported

Start browser, run tests

Run tests

Run tests

IE 7

not supported

Start browser, run tests

Run tests

Run tests

Safari 3

not supported

Start browser, run tests

Run tests

not supported

Safari 2

not supported

Start browser, run tests

Run tests

not supported

Opera 9

not supported

Start browser, run tests

Run tests

Run tests

Opera 8

not supported

Start browser, run tests

Run tests

Run tests

Chrome

not supported

Start browser, run tests***

Run tests***

Run tests***

Others

not supported

Partial support possible*

Run tests**

not supported

3.selenium下载及驱动安装

  • selenium安装:使用pip安装即可
pip install selenium
  • Selenium 支持非常多的浏览器,如 Chrome、Firefox、Edge 等,还有 Android、BlackBerry 等手机端的浏览器。
    可以用如下方式进行初始化:
from selenium import webdriver
browser = webdriver.Chrome() 
browser = webdriver.Firefox() 
browser = webdriver.Edge() 
browser = webdriver.Safari()
browser = webdriver.Android()
browser = webdriver.Ie()
browser = webdriver.Opera()
browser = webdriver.PhantomJS()

下面介绍Chrome、ie、firefox驱动的下载和安装使用:

Chrome下载:http://chromedriver.storage.googleapis.com/index.html

考虑到国内下载谷歌地址可能比较慢,我们可以通过阿里的镜像站下载,地址:http://npm.taobao.org/mirrors/chromedriver/

  1. 首先到chrome浏览器检查版本号(设置-帮助-关于Google Chrome),Chrome版本号需要和本地Chrome版本一致
  2. java selenium四层处理框架 selenium的框架_selenium

  3. 然后将解压出来的chromedriver.exe文件放入一个已经加入环境变量的目录中,或者将chromedriver.exe所在目录加入环境变量。
    这里推荐将chromedriver.exe放入python安装目录下的Scripts目录中。
    验证安装:
C:\Users\asus>chromedriver
Starting ChromeDriver 101.0.4951.41 (93c720db8323b3ec10d056025ab95c23a31997c9-refs/branch-heads/4951@{#904}) on port 9515
Only local connections are allowed.
Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.
ChromeDriver was started successfully.

弹出以上提示表示安装成功。

  1. 在程序中测试,执行如下 Python 代码:
from selenium import webdriver
browser = webdriver.Chrome()

弹出如下图片就是安装成功了

java selenium四层处理框架 selenium的框架_firefox_02

Firefox安装
  1. 对于 Firefox 来说,也可以使用同样的方式完成 Selenium 的对接,这时需要安装另一个驱动 GeckoDriver。
    相关链接:
    GitHub:https://github.com/mozilla/geckodriver
    下载地址:https://github.com/mozilla/geckodriver/releases
    同样需要事先安装Firefox 浏览器。
    同样也可以在阿里云镜像网站下载,地址:http://npm.taobao.org/mirrors/geckodriver/
    下载后同样将解压的geckodriver.exe放入已经加入环境变量的目录中。
    验证安装:
C:\Users\asus>geckodriver
1652062712505   geckodriver     INFO    Listening on 127.0.0.1:4444

有类似以上提示表示安装成功。

  1. 在程序中测试,执行如下 Python 代码:
from selenium import webdriver  
browser = webdriver.Firefox()

弹出一个空白的Firefox浏览器,则表示安装成功。

IE安装:http://selenium-release.storage.googleapis.com/index.html
  1. 这里下载的版本是:http://selenium-release.storage.googleapis.com/index.html?path=3.9/
    同样的,下载解压后放入已经加入环境变量的目录中
C:\Users\asus>iedriverserver
Started InternetExplorerDriver server (32-bit)
3.9.0.0
Listening on port 5555
Only local connections are allowed

有类似以上提示表示安装成功。

  1. 在程序中测试,执行如下 Python 代码:
from selenium import webdriver
browser = webdriver.Ie()

弹出如下图片就是安装成功了

java selenium四层处理框架 selenium的框架_Chrome_03

二、操作浏览器

1.加载配置方式

以 Chrome 为例,在 Chrome 浏览器地址栏输入 chrome://version/ 打开,如图所示:

java selenium四层处理框架 selenium的框架_Chrome_04

我们可以看到个人资料路径这一项,取到路径:C:\Users\asus\AppData\Local\Google\Chrome\User Data\Default,取到 User Data 使用自己设置的配置,取到 Default 使用默认配置。看下示例:

from selenium import webdriver

option = webdriver.ChromeOptions()
# 自己的数据目录(需要将复制的路径中的 \ 替换成 / 或进行转义 \\)
# option.add_argument('--user-data-dir=C:\Users\asus\AppData\Local\Google\Chrome\User Data')
option.add_argument('--user-data-dir=C:\\Users\\asus\\AppData\\Local\\Google\\Chrome\\User Data')
browser = webdriver.Chrome(chrome_options=option)
browser.get('https://mail.163.com/')
# 关闭
browser.quit()

如果执行时报错没有打开指定页面,可先将浏览器关闭再执行。

2.Headless 方式

前两种方式都是有浏览器界面的方式,Headless 模式是 Chrome 浏览器的无界面形态,可以在不打开浏览器的前提下,使用所有 Chrome 支持的特性运行我们的程序。这种方式更加方便测试 Web 应用、获得网站的截图、做爬虫抓取信息等。看下示例:

from selenium import webdriver

chrome_options = webdriver.ChromeOptions()
# 使用 headless 无界面浏览器模式
chrome_options.add_argument('--headless')
# 禁用 gpu 加速
chrome_options.add_argument('--disable-gpu')

# 启动浏览器,获取网页源代码
browser = webdriver.Chrome(chrome_options=chrome_options)
url = 'https://mail.163.com/'
browser.get(url)
print('browser text = ',browser.page_source)
browser.quit()

3.设置浏览器窗口

最大化显示

browser.maximize_window()

最小化显示

browser.minimize_window()

自定义大小

# 宽 500,高 800
browser.set_window_size(500,800)

4.前进后退

前进

browser.forward()

后退

browser.back()

三、元素定位

Selenium 提供了多种元素定位方式,我们以 Chrome 浏览器 Headless 方式为例。看下示例:

from selenium import webdriver

chrome_options = webdriver.ChromeOptions()
# 使用 headless 无界面浏览器模式
chrome_options.add_argument('--headless')
# 禁用 gpu 加速
chrome_options.add_argument('--disable-gpu')

# 启动浏览器,获取网页源代码
browser = webdriver.Chrome(chrome_options=chrome_options)
url = 'https://xxx.xxx.com/'
browser.get(url)
data = browser.page_source

假设访问地址 https://xxx.xxx.com/,返回 data 为如下内容。

<html>
    <body>
        <form>
            <input id="testid" name="testid" type="text" />
            <input id="firstName" name="fname" class="fname" type="text" />
            <input id="lastName" name="fname" class="fname" type="text" />
            <a href="index.html">index</a>
        </form>
    </body>
</html>

1.根据 id 定位

browser.find_element_by_id('fid')

2.根据 name 定位

# 返回第一个元素
browser.find_element_by_name('fname')
# 返回所有元素
browser.find_elements_by_name('fname')

3.根据 class 定位

# 返回第一个元素
browser.find_element_by_class_name('fname')
# 返回所有元素
browser.find_elements_by_class_name('fname')

4.根据标签名定位

# 返回第一个元素
browser.find_element_by_tag_name('input')
# 返回所有元素
browser.find_elements_by_tag_name('input')

5.使用 CSS 定位

# 返回第一个元素
browser.find_element_by_css_selector('.fname')
# 返回所有元素
browser.find_elements_by_css_selector('.fname')

6.使用链接文本定位超链接

# 返回第一个元素
browser.find_element_by_link_text('index')
# 返回所有元素
browser.find_elements_by_link_text('index')
# 返回第一个元素
browser.find_element_by_partial_link_text('index')
# 返回所有元素
browser.find_elements_by_partial_link_text('index')

7.使用 xpath 定位

# 返回第一个元素
browser.find_elements_by_xpath("//input[@id='fid']")
# 返回所有元素
browser.find_elements_by_xpath("//input[@name='fname']")

四、等待事件

Web 应用大多都使用 AJAX 技术进行加载,浏览器载入一个页面时,页面内的元素可能会在不同的时间载入,这会加大定位元素的困难程度,因为元素不在 DOM 里,会抛出 ElementNotVisibleException 异常,使用 Waits,我们就可以解决这个问题。

Selenium WebDriver 提供了显式和隐式两种 Waits 方式,显式的 Waits 会让 WebDriver 在更深一步的执行前等待一个确定的条件触发,隐式的 Waits 则会让 WebDriver 试图定位元素的时候对 DOM 进行指定次数的轮询。

1.显示等待

WebDriverWait 配合该类的 until()until_not() 方法,就能够根据判断条件而进行灵活地等待了。它主要流程是:程序每隔 x 秒检查一下,如果条件成立了,则执行下一步操作,否则继续等待,直到超过设置的最长时间,然后抛出 TimeoutException 异常。先看一下方法:

__init__(driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None)

  • driver: 传入 WebDriver 实例;
  • timeout: 超时时间,单位为秒;
  • poll_frequency: 调用 until 或 until_not 中方法的间隔时间,默认是 0.5 秒;
  • ignored_exceptions: 忽略的异常,如果在调用 until 或 until_not 的过程中抛出这个元组中的异常,则不中断代码,继续等待,如果抛出的是这个元组外的异常,则中断代码,抛出异常。默认只有 NoSuchElementException。

until(method, message='')

  • method: 在等待期间,每隔一段时间(init 中的 poll_frequency)调用这个方法,直到返回值不是 False;
  • message: 如果超时,抛出 TimeoutException,将 message 传入异常。

until_not(method, message='')

until 方法是当某条件成立则继续执行,until_not 方法与之相反,它是当某条件不成立则继续执行,参数与 until 方法相同。

以百度为例,看一下示例:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.Chrome()
browser.get('https://www.baidu.com/')
try:    
    # 超时时间为 5 秒    
    data = WebDriverWait(browser,5).until(EC.presence_of_element_located((By.ID,'su')))    
    print(data)
finally:
    browser.quit()

示例中代码会等待 5 秒,如果 5 秒内找到元素则立即返回,否则会抛出 TimeoutException 异常,WebDriverWait 默认每 0.5 秒调用一下 ExpectedCondition 直到它返回成功为止。

2.隐式等待

当我们要找一个或者一些不能立即可用的元素的时候,隐式 Waits 会告诉 WebDriver 轮询 DOM 指定的次数,默认设置是 0 次,一旦设定,WebDriver 对象实例的整个生命周期的隐式调用也就设定好了。看一下方法:

implicitly_wait(time_to_wait)

隐式等待是设置了一个最长等待时间 time_to_wait,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。看到了这里,我们会感觉有点像 time.sleep(),它们的区别是:time.sleep() 必须等待指定时间后才能继续执行, time_to_wait 是在指定的时间范围加载完成即执行,time_to_wait 比 time.sleep() 更灵活一些。

看下示例:

from selenium import webdriver
browser = webdriver.Chrome()
browser.implicitly_wait(5)
browser.get('https://www.baidu.com/')
data = browser.find_element_by_id('su')
print(data)
browser.quit()

五、实战练习

下面我们以百度搜索为实战项目

1.无界面测试

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

chrome_options = webdriver.ChromeOptions()
# 使用 headless 无界面浏览器模式
chrome_options.add_argument('--headless')
# 禁用 gpu 加速
chrome_options.add_argument('--disable-gpu')

# 启动浏览器,获取网页源代码
browser = webdriver.Chrome(chrome_options=chrome_options)
# 窗口最大化
browser.maximize_window()
# 打开百度地址
browser.get('https://www.baidu.com/')
# 显示等待,超时时间为 5 秒
data = WebDriverWait(browser, 5).until(EC.presence_of_element_located((By.ID, 'su')))
# 通过id获取文本输入框,输入查询内容
browser.find_element(By.ID, 'kw').send_keys('测试')
# 通过Xpath获取百度一下按钮,然后点击
browser.find_element(By.XPATH, '//*[@id="su"]').click()
# 隐式等待2s
browser.implicitly_wait(2)
# 打印页面加载内容
print(browser.page_source)
# 隐式等待2s
browser.implicitly_wait(2)
# 关闭浏览器
# browser.quit()

2.显示界面测试

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

chrome_options = webdriver.ChromeOptions()
# # 使用 headless 无界面浏览器模式
# chrome_options.add_argument('--headless')
# # 禁用 gpu 加速
# chrome_options.add_argument('--disable-gpu')

# 启动浏览器,获取网页源代码
browser = webdriver.Chrome(chrome_options=chrome_options)
# 窗口最大化
browser.maximize_window()
# 打开百度地址
browser.get('https://www.baidu.com/')
# 显示等待,超时时间为 5 秒
data = WebDriverWait(browser, 5).until(EC.presence_of_element_located((By.ID, 'su')))
# 通过id获取文本输入框,输入查询内容
browser.find_element(By.ID, 'kw').send_keys('测试')
# 通过Xpath获取百度一下按钮,然后点击
browser.find_element(By.XPATH, '//*[@id="su"]').click()
# 隐式等待2s
browser.implicitly_wait(2)
# 打印页面加载内容
print(browser.page_source)
# 隐式等待2s
browser.implicitly_wait(2)
# 关闭浏览器
browser.quit()

注释掉# 关闭浏览器最后界面会显示在下图所示:

java selenium四层处理框架 selenium的框架_firefox_05