selenium python webdriver基础 -九游会国际娱乐

玩技e族 auto测试评论143字数 11699阅读38分59秒阅读模式

欢迎阅读webdriver基础讲义。本篇讲义将会重点介绍selenium webdriver的环境搭建和基本使用方法。文章源自玩技e族-https://www.playezu.com/12583.html

webdriver环境搭建

selenium webdriver 又称为 selenium2。文章源自玩技e族-https://www.playezu.com/12583.html

selenium 1 webdriver = selenium 2文章源自玩技e族-https://www.playezu.com/12583.html

webdriver是主流web应用自动化测试框架,具有清晰面向对象 api,能以最佳的方式与浏览器进行交互。文章源自玩技e族-https://www.playezu.com/12583.html

支持的浏览器:文章源自玩技e族-https://www.playezu.com/12583.html

  • mozilla firefox
  • google chrome
  • microsoft internet explorer
  • opera
  • safari
  • apple iphone
  • android browsers

环境搭建步骤

在上一篇中,我们已经确认使用python来进行webdriver的编码和操作。事实上python selenium webdriver环境的搭建分为两个部分:文章源自玩技e族-https://www.playezu.com/12583.html

  1. 安装python
  2. 安装selenium

标准的安装步骤文章源自玩技e族-https://www.playezu.com/12583.html

  1. 选择python的版本。python主流的有两个大的版本,2.7和3.5(请注意,从python的3.5版本开始,不再支持windows xp操作系统,windows xp用户请安装3.4版本)。我们的例子将会选用面向未来的3.5版本。
  2. 安装python。在python的九游会国际娱乐官网下载最新的安装包,进行界面安装。

    安装的时候,推荐选择“add exe to path”,将会自动添加python的程序到环境变量中。然后可以在命令行输入python -v检测安装的python版本。文章源自玩技e族-https://www.playezu.com/12583.html

    当前的版本安装中将会默认已经安装了setuptoolspip这两个python的基本工具。如果使用了比较旧的python版本的话,需要自行安装这两个工具。文章源自玩技e族-https://www.playezu.com/12583.html

    • setuptools:python的基础工具包,用来构建、安装卸载python程序
    • pip:python软件包的安装和管理工具。通过pip可以简单的安装python的任意类库
  3. 安装selenium2.0版本。在windows安装selenium2.0,有两种途径。使用pip命令行或者源码安装。以下两种方法,使用任何一个均可。推荐pip的方式。
    1. 方法一:pip命令行安装,运行 | cmd,打开命令行,-u其实就是--upgrade,升级安装。
      pip install -u selenium
      
    2. 方法二:源码解压安装,前往下载最新版的pypi版本的selenium,解压后执行
      python setup.py install
      

ubuntu下的环境搭建

在ubuntu下的python的解释器一般情况下已经存在了。我们需要打开终端,输入python -v命令进行验证。如果没有安装python,那么需要去python九游会国际娱乐官网上下载指定版本的源文件,进行源码安装。安装完了以后并进行环境变量的设置。文章源自玩技e族-https://www.playezu.com/12583.html

安装selenium webdriver的方法与上述在windows环境下安装部署的方法一致。依旧推荐使用pip命令行进行安装。文章源自玩技e族-https://www.playezu.com/12583.html

使用ide编写python

在上述环境搭建好以后,我们便可使用python来编写自动化脚本程序,执行selenium自动化测试。在此之前,我们依旧需要解决一个问题,那就是ide的选择。文章源自玩技e族-https://www.playezu.com/12583.html

ide,integrated development environment,集成开发环境。一个好的编辑器或者好的ide将会极大的提高生产力,帮我们做很多事情,使得编码工作更加简单,编码的体验更加容易。一般情况下,我们有以下几种工具可以选择:文章源自玩技e族-https://www.playezu.com/12583.html

  • idle:python自带的ide,功能简单,使用方便
  • notepad :一个强大的开源编辑器
  • vim:linux系统中最好用的编辑器之一
  • sublime text:一个非常轻便好用的现代化的编辑器,推荐。
  • pycharm:jetbrains公司提供的现代化的跨平台的python ide。

使用sublime text 3搭建python环境文章源自玩技e族-https://www.playezu.com/12583.html

  1. ****通过快捷键ctrl 或者view > show console打开控制台,输入以下代码并回车
    import urllib.request,os; pf = 'package control.sublime-package'; 
    ipp = sublime.installed_packages_path(); 
    urllib.request.install_opener( urllib.request.build_opener( urllib.request.proxyhandler()) ); 
    open(os.path.join(ipp, pf), 'wb').write(urllib.request.urlopen( 'http://sublime.wbond.net/'   pf.replace(' ',' ')).read())
    
  2. 安装完以后,重启sublime text 3
  3. 如果在perferences->package settings中看到package control这一项,则安装成功
  4. 按下ctrl shift p调出命令面板
  5. 输入install package选项并回车
  6. 输入i,匹配到以后,按回车,安装。anaconda是一个终极的python插件。安装完了以后便可用sublime text 3编写python代码,并且使用ctrl b来编译执行。

一般来说,一个好的ide提供一下功能,使你的编码开发工作变得更有效率:文章源自玩技e族-https://www.playezu.com/12583.html

  1. 一个图形化的智能代码提示和补全功能
  2. 可以轻松查看方法和类
  3. 语法高亮
  4. 提供单元测试和调试的工具
  5. 源代码版本管理工具的支持

我们可以尝试用上述的编辑器或者ide来进行python代码编写工作。文章源自玩技e族-https://www.playezu.com/12583.html

开始使用webdriver

接下来我们尝试几个简单的例子来体会一下selenium webdriver的使用。文章源自玩技e族-https://www.playezu.com/12583.html

示例1文章源自玩技e族-https://www.playezu.com/12583.html

## 引入webdriver的包
from selenium import webdriver
## 创建浏览器对象
browser = webdriver.firefox()
## 打开百度网站
browser.get('https://www.baidu.com/')

示例2文章源自玩技e族-https://www.playezu.com/12583.html

## 引入webdriver包
from selenium import webdriver
## 引入webdriver keys包
from selenium.webdriver.common.keys import keys
## 创建浏览器对象
browser = webdriver.firefox()
## 导航到百度九游会国际娱乐主页
browser.get('https://www.baidu.com')
## 检查标题是否为‘百度一下,你就知道’
assert '百度一下,你就知道' in browser.title
## 找到名字为wd的元素,赋值给elem
elem = browser.find_element_by_name('wd')  # 找到搜索框
elem.send_keys('seleniumhq'   keys.return)  # 搜索seleniumhq
## 关闭浏览器
browser.quit()

selenium 3.0.1 出现的问题以及解决

3.0.1 更新以后,需要做两个操作:文章源自玩技e族-https://www.playezu.com/12583.html

  1. geckodriver executable needs to be in path。geckodirver的下载地址:
    报错内容:
webdriverexception:message:'geckodriver'executable needs to be in path  

geckodriver是一原生态的第三方浏览器,对于selenium3.x版本都会使用geckodriver来驱动firefox,所以需要下载geckodriver.exe。放置在path 环境变量可以访问到的地方。例如 c:\python34文章源自玩技e族-https://www.playezu.com/12583.html

  1. 需要将火狐的安装路径放到path,然后重启(必须重启电脑)
    报错内容:
selenium.common.exceptions.webdriverexception: message: 'geckodriver' executable needs to be in path. 

参考地址:文章源自玩技e族-https://www.playezu.com/12583.html

xampp的安装部署和环境搭建

xampp的安装,在windows操作系统中比较简单,可以直接运行安装文件,默认全部下一步,即可完成软件的安装。文章源自玩技e族-https://www.playezu.com/12583.html

请注意:windows xp系统只能可以 xampp 1.8.2版本;windows 7以及以上的系统可以安装最新版的xampp。xampp不分32位和64位操作系统。文章源自玩技e族-https://www.playezu.com/12583.html

xampp的部署

xampp = os apache mysql php perl文章源自玩技e族-https://www.playezu.com/12583.html

我们一般部署的网站,符合xampp环境的话,只需要启动apache和mysql两个应用。文章源自玩技e族-https://www.playezu.com/12583.html

部署步骤文章源自玩技e族-https://www.playezu.com/12583.html

  1. 启动apache
  2. 启动mysql
  3. 解压网站源文件,例如解压然之:ranzhi.2.5.zip,请把压缩包里面的ranzhi这个文件夹解压出来;禅道也类似,需要把压缩包中的zentaopms文件夹解压出来
  4. 部署源文件,请将解压以后的源文件放到xampp\htdocs文件夹中
  5. 通过浏览器访问部署好的网站源文件,进行向导安装。http://localhost/ranzhi/wwwps:这里我们主要支持的是php mysql开发的网站部署。

xampp的问题解决

  • 无法启动apache:请认真查看日志,判断80和443端口被什么样的程序占用,需要关闭对应程序,或者修改apache的端口。
  1. iis:控制面板 | 管理工具 | internet信息服务 | 默认网站 | 关闭
  2. visualsvn server: 控制面板 | 管理工具 | visualsvn server | 关闭
  3. vmware workstation: 开始 | vmware workstation | 编辑 | 首选项 | 共享虚拟机 | 禁用共享
  4. hp loadrunner: 右侧任务栏 | 右键 | 关闭
  5. 修改xampp apache 端口:config | httpd.conf修改linsten 80 | httpd-ssl.conf修改 listen 443
  • 无法启动mysql:请认真查看错误日志,找到已经启动的mysql的程序进程,杀掉该进程。

使用unittest编写测试脚本

通过上面的例子,我们可以简单的写出selenium webdriver的脚本,但是对于测试工作来说,上述的脚本还远远不够。因为上述的脚本没有“检查”。文章源自玩技e族-https://www.playezu.com/12583.html

接下来我们将会使用python语言的unittest框架展开“检查”。文章源自玩技e族-https://www.playezu.com/12583.html

unittest基础

unittest框架的原本的名字是pyunit。是从junit这样一个被广泛使用的java应用开发的单元测试框架创造而来。类似的框架还有nunit(.net开发的单元测试框架)等。文章源自玩技e族-https://www.playezu.com/12583.html

我们可以使用unittest框架为任意python项目编写可理解的单元测试集合。现在这个unittest已经作为python的标准库模块发布。我们安装完python以后,便可以直接使用unittest。文章源自玩技e族-https://www.playezu.com/12583.html

unittest框架提供了编写test casestest suitestest fixtures的基本功能。我们首先关注 test cases的编写与执行。文章源自玩技e族-https://www.playezu.com/12583.html

使用unittest需要以下简单的三步:文章源自玩技e族-https://www.playezu.com/12583.html

  • 引入unittest模组
  • 继承unittest.testcase基类
  • test开头

unittest示例文章源自玩技e族-https://www.playezu.com/12583.html

## 引入unittest模组
import unittest
## 定义测试类,名字为demotests
## 该类必须继承unittest.testcase基类
class demotests(unittest.testcase):
    ## 使用'@'修饰符,注明该方法是类的方法
    ## setupclass方法是在执行测试之前需要先调用的方法
    ## 是开始测试前的初始化工作
    @classmethod
    def setupclass(cls):
        pass
    ## 测试一(务必以test开头)
    def test_01(self):
        pass
    ## 测试三(务必以test开头)
    def test_02(self):
        pass
    ## 测试三(务必以test开头)
    def test_03(self):
        pass
    ## teardownclass方法是执行完所有测试后调用的方法
    ## 是测试结束后的清除工作
    @classmethod
    def teardownclass(cls):
        pass
# 执行测试主函数
if __name__ == '__main__':
    ## 执行main全局方法,将会执行上述所有以test开头的
    unittest.main(verbosity=2)

python知识的补充:文章源自玩技e族-https://www.playezu.com/12583.html

  1. python文件的后缀名是.py
  2. .py文件可以用来直接执行。也可以被用来作为模块导入。在cmd命令行中执行的命令为python demo.py
  3. 在python中导入模块(模组)一般使用的是import

使用unittest框架编写selenium webdriver测试

接下来我们查看一个完整的selenium webdriver自动化测试实例文章源自玩技e族-https://www.playezu.com/12583.html

实例文章源自玩技e族-https://www.playezu.com/12583.html

import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import keys
class searchtests(unittest.testcase):
    def setup(self):
        # 创建一个新的浏览器对象
        self.driver = webdriver.firefox()
        self.driver.implicitly_wait(30)
        self.driver.maximize_window()
        # 导航到京东九游会国际娱乐主页
        self.driver.get("https://www.jd.com/")
    def test_search_by_category(self):
        # 获取到搜索框
        self.search_field = self.driver.find_element_by_id("key")
        self.search_field.clear()
        # 输入iphone 6s plus并按下回车进行搜索
        self.search_field.send_keys("iphone 6s plus"    keys.return)
        # 获取所有的查询结果
        products = self.driver.find_elements_by_css_selector("li[class='gl-item']")
        # 断言:检查查询出来的个数是否为24个
        self.assertequal(24, len(products))
    def teardown(self):
        # 关闭浏览器对象
        self.driver.quit()
if __name__ == '__main__':
    unittest.main(verbosity=2)

理解unittest框架提供的各种断言方法

方法 method 检查条件
assertequal(a, b [, msg]) a == b,msg可选,用来解释失败的原因
assertnotequal(a, b [, msg] a != b,msg可选,用来解释失败的原因
asserttrue(x [, msg]) x 是真,msg可选,用来解释失败的原因
assertfalse(x [, msg]) x 是假,msg可选,用来解释失败的原因
assertisnot(a, b [, msg]) a 不是 b,msg可选,用来解释失败的原因

webdriver api 基本操作

这里我们将会开始webdriver api的基本操作,从元素定位以及浏览器的基本操作开始。文章源自玩技e族-https://www.playezu.com/12583.html

定位符

元素的定位和操作是自动化测试的核心部分,其操作是建立在定位的基础上的。因此我们首选要开始定位元素。文章源自玩技e族-https://www.playezu.com/12583.html

在html里面,元素具有各种各样的属性。我们可以通过这样唯一区别其他元素的属性来定位到这个元素。webdriver提供了一系列的元素定位方法。常见的有以下几种:文章源自玩技e族-https://www.playezu.com/12583.html

  • id
  • name
  • class name
  • tag
  • link text
  • partial link text
  • xpath
  • css selector

查找简单元素

我们从简单的一个元素开始定位。最基本的方法是idname。大多数元素有这两个属性,在对控件的idname命名是一般也会使其有意义,而取不同的名字。文章源自玩技e族-https://www.playezu.com/12583.html

例如我们看下面这段html文章源自玩技e族-https://www.playezu.com/12583.html

"search" type="text" name="q" value="" class="input-text" maxlength="128" />

我们可以使用对应的方法来定位这个input文章源自玩技e族-https://www.playezu.com/12583.html

find_element_by_id('search')
find_element_by_name('q')
find_element_by_class_name('input-text')

这里我们开始用最简单的方式来尝试定位文章源自玩技e族-https://www.playezu.com/12583.html

查看下面一个例子文章源自玩技e族-https://www.playezu.com/12583.html

self.driver.get('http://pro.demo.zentao.net')
# 用name定位用户文本输入框
self.account_field = self.driver.find_element_by_name('account')
# 用name定位密码文本输入框
self.password_field = self.driver.find_element_by_name('password')
self.account_field.clear()
self.password_field.clear()
self.driver.implicitly_wait(30)
# 输入用户名demo
self.account_field.send_keys('demo')
# 输入密码123456
self.password_field.send_keys('123456')
self.driver.find_element_by_id('submit').click()
self.driver.implicitly_wait(30)
companyname = self.driver.find_element_by_id('companyname')
self.assertequal('demo项目管理系统', companyname.text)

示例2文章源自玩技e族-https://www.playezu.com/12583.html

self.driver.find_element_by_id('menuproduct').click()
self.driver.implicitly_wait(30)
self.driver.find_element_by_id('menuproject').click()
self.driver.implicitly_wait(30)
self.driver.find_element_by_id('menuqa').click()
self.driver.implicitly_wait(30)
self.driver.find_element_by_id('menudoc').click()
self.driver.implicitly_wait(30)
self.driver.find_element_by_id('menureport').click()
self.driver.implicitly_wait(30)
self.driver.find_element_by_id('menucompany').click()
self.driver.implicitly_wait(30)
self.driver.find_element_by_link_text('退出').click()
self.driver.implicitly_wait(30)

此外xpath定位和css selector定位,和定位一组元素这样的内容案例,将在后续的讲义继续探讨和讲解。文章源自玩技e族-https://www.playezu.com/12583.html

控制浏览器

浏览器的控制也是自动化测试的一个基本组成部分,我们可以将浏览器最大化,设置浏览器的高度和宽度以及对浏览器进行导航操作等。文章源自玩技e族-https://www.playezu.com/12583.html

## 浏览器最大化
driver.maximize_window()
## 设置浏览器的高度为800像素,宽度为480像素
driver.set_window_size(480, 800)
## 浏览器后退
driver.back()
## 浏览器前进
driver.forward()

这里我们做一个综合性的练习实例文章源自玩技e族-https://www.playezu.com/12583.html

# coding=utf-8
import unittest
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
# import sys
# reload(sys)
# sys.setdefaultencoding('utf8')
class webdrivertests(unittest.testcase):
    @classmethod
    def setupclass(cls):
        # create a new firefox session
        cls.driver = webdriver.firefox()
        cls.driver.get('about:blank')
        cls.driver.implicitly_wait(30)
        print(" -- set up finished -- ")
        print()
    def test_01_navigate(self):
        pass
        url_baidu = 'https://www.baidu.com/'
        url_zentao = 'http://pro.demo.zentao.net/user-login-lw==.html'
        # 导航到百度
        self.driver.get(url_baidu)
        self.driver.maximize_window()
        self.driver.implicitly_wait(30)
        # 导航到禅道
        self.driver.get(url_zentao)
        self.driver.maximize_window()
        self.driver.implicitly_wait(30)
        # 后退
        self.driver.back()
        self.assertequal(url_baidu, self.driver.current_url)
        self.driver.implicitly_wait(30)
        # 前进
        self.driver.forward()
        self.assertequal(url_zentao, self.driver.current_url)
        self.driver.implicitly_wait(30)
        print("-- test 01 finished -- ")
        print()
    def test_02_element_interaction(self):
        self.driver.get('http://pro.demo.zentao.net')
        ## 找到用户名和密码的输入框
        self.account_field = self.driver.find_element_by_name('account')
        self.password_field = self.driver.find_element_by_name('password')
        ## 清除当前的输入
        self.account_field.clear()
        self.password_field.clear()
        self.driver.implicitly_wait(30)
        ## 输入用户名和密码,进行登录
        self.account_field.send_keys('demo')
        self.password_field.send_keys('123456')
        self.driver.find_element_by_id('submit').click()
        self.driver.implicitly_wait(30)
        companyname = self.driver.find_element_by_id('companyname')
        self.assertequal('demo项目管理系统', companyname.text)
        print(companyname.get_attribute('type'))
        print()
        self.driver.implicitly_wait(30)
        print('-- test 02 finished -- ')
        print()
    def test_03_element_interation2(self):
        ## 这里执行了一段代码
        js = 'selecttheme("green")'
        self.driver.execute_script(js)
        self.driver.implicitly_wait(30)
        js = 'selecttheme("red")'
        self.driver.execute_script(js)
        self.driver.implicitly_wait(30)
        js = 'selecttheme("lightblue")'
        self.driver.execute_script(js)
        self.driver.implicitly_wait(30)
        js = 'selecttheme("blackberry")'
        self.driver.execute_script(js)
        self.driver.implicitly_wait(30)
        self.driver.find_element_by_id('menuproduct').click()
        self.driver.implicitly_wait(30)
        self.driver.find_element_by_id('menuproject').click()
        self.driver.implicitly_wait(30)
        self.driver.find_element_by_id('menuqa').click()
        self.driver.implicitly_wait(30)
        self.driver.find_element_by_id('menudoc').click()
        self.driver.implicitly_wait(30)
        self.driver.find_element_by_id('menureport').click()
        self.driver.implicitly_wait(30)
        self.driver.find_element_by_id('menucompany').click()
        self.driver.implicitly_wait(30)
        self.driver.find_element_by_link_text('退出').click()
        self.driver.implicitly_wait(30)
        webdriverwait(self.driver, 10).until(
            expected_conditions.element_to_be_clickable((by.id, "submit")))
        self.driver.implicitly_wait(30)
        print('-- test 03 finished -- ')
        print()
    def test_04_cookies(self):
        self.driver.add_cookie(
            {'name': 'key-neeeeew', 'value': 'value-neeeewwwww'})
        # 遍历cookies 中的name 和value 信息打印,当然还有上面添加的信息
        for cookie in self.driver.get_cookies():
            print("%s -> %s" % (cookie['name'], cookie['value']))
            print()
        self.driver.delete_all_cookies()
        cookies = self.driver.get_cookies()
        print(cookies)
        print()
        print('-- test 04 finished -- ')
        print()
    @classmethod
    def teardownclass(cls):
        # close the browser window
        cls.driver.quit()
        pass
        print('-- tear down finished -- ')
        print()
if __name__ == '__main__':
    unittest.main(verbosity=2)
文章源自玩技e族-https://www.playezu.com/12583.html
注意:本文法律责任由该作者承担,侵权请联系▷诈骗举报◁▷新闻不符◁▷我要投稿◁
免责声明:本文内容来自用户上传并发布或网络新闻客户端自媒体,玩技博客仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系删除。

发表评论

匿名网友
确定