selenium框架

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适用于以下浏览器:

BrowserSelenium IDESelenium Remote ControlSelenium CoreSelenium 2/Webdriver API
Firefox 10Record and playback testsStart browser, run testsRun testsRun tests
Firefox 9Record and playback testsStart browser, run testsRun testsRun tests
Firefox 8Record and playback testsStart browser, run testsRun testsRun tests
Firefox 7Record and playback testsStart browser, run testsRun testsRun tests
Firefox 6Record and playback testsStart browser, run testsRun testsRun tests
Firefox 5Record and playback testsStart browser, run testsRun testsRun tests
Firefox 4Record and playback testsStart browser, run testsRun testsRun tests
Firefox 3.6Record and playback testsStart browser, run testsRun testsRun tests
Firefox 3Record and playback testsStart browser, run testsRun testsnot supported
IE 9not supportedStart browser, run testsRun testsRun tests
IE 8not supportedStart browser, run testsRun testsRun tests
IE 7not supportedStart browser, run testsRun testsRun tests
Safari 3not supportedStart browser, run testsRun testsnot supported
Safari 2not supportedStart browser, run testsRun testsnot supported
Opera 9not supportedStart browser, run testsRun testsRun tests
Opera 8not supportedStart browser, run testsRun testsRun tests
Chromenot supportedStart browser, run tests***Run tests***Run tests***
Othersnot supportedPartial 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. 然后将解压出来的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.
      

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

    3. 在程序中测试,执行如下 Python 代码:

      from selenium import webdriver
      browser = webdriver.Chrome()
      

      弹出如下图片就是安装成功了
      在这里插入图片描述

    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
      

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

    2. 在程序中测试,执行如下 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
      

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

    2. 在程序中测试,执行如下 Python 代码:

      from selenium import webdriver
      browser = webdriver.Ie()
      

      弹出如下图片就是安装成功了
      在这里插入图片描述

二、操作浏览器

1.加载配置方式

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

我们可以看到个人资料路径这一项,取到路径: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()

注释掉# 关闭浏览器最后界面会显示在下图所示:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

js瘋纸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值