美文网首页软件测试
一步到位—带你入门Selenium

一步到位—带你入门Selenium

作者: 梵音11 | 来源:发表于2020-07-03 21:48 被阅读0次

    一、Selenium自动化测试环境搭建

    1.cmd --- pip install selenium==2.53.0 (如果selenium后面不跟==,表示默认安装最新版本)

    2. pip show selenium 查看selenium安装的版本号(该操作在cmd->windows下面查看)

    (注意:1.pip 是什么? pip是python2.7.9版本以后自动集成到python中的一个包管理工具,方便下载和python

    有关的包或者模块)

    3.验证环境是否安装成功python交互模式下--->输入from selenium import webdriver -->运行无报错(安装成功)

    4.配置浏览器驱动,这里我们教学使用的chrome浏览器,目前最新的版本是63.0.3239.84(正式版本)

    5.下载谷歌浏览器的驱动文件 chromedriver.exe

    谷歌浏览器驱动下载地址:

    http://chromedriver.storage.googleapis.com/index.html

    谷歌浏览器驱动及版本对应匹配参考表:

    http://chromedriver.storage.googleapis.com/index.html

    6.直接将chromedriver.exe (chromedriver.exe原封不动复制到C:\Python27目录下面)

    7.在idle编辑器里面敲一段代码:

    from selenium import webdriver

    driver = webdriver.Chrome()

    driver.get('https://www.baidu.com')

    二、PyCharm开发集成环境部署及快捷键

    1.科学上网:访问 https://www.jetbrains.com/pycharm/download/#section=windows

    2.选择community(社区版) 版本 足够用

    快捷键:

    1.注释 ctrl + /

    2.取消注释 在次ctrl + /

    3.运行 右键点击Run按钮 或者使用快捷键 ctrl + shift + F10

    4.创建python文件

    1.点击编辑器主项目工程文件目录->file->python file

    2.在windows下面的主项目工程文件目录里面->创建一个pyhton文件 如demo.txt ---->demo.py

    5.替换    ctrl+r  替换单个或者替换多个 replace replace all

    6.回退 shift+table

    7.缩进 table

    8.#coding=utf-8 (中文编码的声明 允许在编辑中写入中文注释 否则报错)

    三、前端工具的安装

    目的:方便web页面的元素定位。

    只有火狐浏览器提供。高版本的火狐浏览器没有,只有低版本的有这个插件。

    FireBug:附加组件--扩展--搜索firebug--点击安装--重启---F12查看 小虫子

    FirePath:附加组件--扩展--搜索firepath--点击安装--重启---F12查看 小虫子上面有没有firepath

    四、前端技术讲解

    前端三剑客:HTML   CSS  JavascriptHTML静态网页 == 文档 标签有开口有闭合(并不是所有标签都有闭合标签 如 img input标签):开始标签: 结束标签:     标签都是有层级关系的:爷爷类标签-->父类标签-->子类标签自动化测试要定位元素---->要认识HTML页面---->要了解HTML页面的层级关系--->学会用程序的视角去找到他们

    HTML中的常用标签说明:

    <html> 声明 这是一个HTML文档

    <head> HTML标签的头部

    <body> 身体包含了N多组标签对

    <a> 超链接 如果a标签后面跟着 href="任何链接" 说明<a>一定是链接

    <p> 段落

    <img> 图像

    <input> 输入 文本框

    <form> 表单(结构 包含input 包含一个button)

    <title> 窗口的标题

    <iframe> 框架 HTML中的框架

    <div> 无名式 代表的是块级元素 div是一个容器 可以包含任意标签

    <span> 无名式 代表的是块级元素 span是一个文本容器 可以包含任意标签

    什么是元素?

    HTML中的开始标签和结束标签之间的所有代码都是元素,元素有属性和属性值。

    demo:

    <input id="kw" name="wd" class="s_ipt" value="" maxlength="100" autocomplete="off">

    如上所述 id 是该元素中的一个属性 它的属性值是 kw 依此类推

    检查属性值的唯一性: f12 -->ctrl + f -->拷贝属性对应的属性值--复制到HTML中的文本框-->enter键查看该属性值是否在整个页面中是否唯一,如果唯一就可以使用该元素去定位。

    五、Webdriver API 学习

    什么是webdriver API?

      他是一套操作浏览器的规范。可以理解为一套N多个函数来实现操作浏览器的方法的集合。比如:元素定位/操作浏览器 /最大化窗口/设置等待/多窗口切换/切换框架/操作警告框等

    元素的八大定位精讲

    id

    name

    class_name

    link_text

    partial_link_text

    tag_name

    xpath

    css_selector

    以上8种元素定位在Python语言中对应的写法如下(笔者之前也写过元素定位方法:https://blog.csdn.net/weixin_48048408/article/details/107114845):

    .find_element_by_id('id的属性值') #必须掌握

    .find_element_by_name('name的属性值') #必须掌握

    .find_element_by_class_name('class的属性值') #必须掌握

    .find_element_by_link_text('文本链接') #必须掌握

    .find_element_by_partial_link_text('部分文本链接') #了解

    .find_element_by_ tag_name('标签名') #了解

    .find_element_by_xpath('很多') #超级重点

    .find_element_by_css_selector('很多') #超级重点

    .click() 点击事件

    .send_keys() 向文本框输入内容

    1.使用id定位百度文本框driver.find_element_by_id('kw').send_keys('demo')2.使用name定位百度文本框driver.find_element_by_name('kw').send_keys('demo')3.使用class定位百度文本框driver.find_element_by_class_name('s_ipt').send_keys('demo')4.使用link_text定位百度首页新闻链接driver.find_element_by_link_text(u'新闻').click()5.partial_link_text部分文本定位新闻链接driver.find_element_by_partial_link_text(u'闻').click()6.使用tag定位百度文本框(不建议使用该方法 因为实际项目中标签名重复的概率非常大 不能代表要定位的元素的唯一性)driver.find_element_by_tag_name('input').send_keys('demo')

    7.定位界的倚天剑 --------xpath 定位

    定位的优缺点:

    优点: 定位语法丰富 当元素没有属性时可以通过xpah的路径定位

    缺点:1.抗变性弱 2.不稳定 3.查找速度慢(相对于CSS定位)

    xpath 的层级关系表示方法: /

    a.绝对路径定位(不稳定,从根一级级往里找)

    driver.find_element_by_xpath('html/body/div[1]/div[1]/div/div[1]/div/form/span[1]/input').send_keys('demo')

    b.相对路径定位(层级和属性结合定位,经常用)

    driver.find_element_by_xpath("//input[@id='kw']").send_keys('demo')

    c.父类属性和层级关系定位(很强大,很实用)

    driver.find_element_by_xpath("//span[@class='bg s_ipt_wr quickdelete-wrap']/input").send_keys('demo')

    d.爷爷类属性和层级关系定位(一定能定位)

    driver.find_element_by_xpath("//form[@id='form']/span/input").send_keys('demo')

    e.使用逻辑运算符定位 and

    driver.find_element_by_xpath("//input[@name='wd' and @autocomplete='off']").send_keys('demo')

    8.定位界的屠龙刀---CSS定位

    CSS是层叠样式表,用于美化web页面的一种技术,我们主要使用CSS中的选择器作为我们元素定位的一种策略。

    CSS定位优缺点:

    优点:1.语法简洁 2.定位速度快 3.抗变性强

    缺点:暂时没发现

    CSS的层级关系表示方法: >

    CSS简写说明:

    id -----------------> #

    class ------------------> .

    8.1CSS使用id class定位百度文本框

    driver.find_element_by_css_selector("#kw").send_keys('demo')

    driver.find_element_by_css_selector(".s_ipt").send_keys('demo')

    8.2CSS使用属性定位(很常用)

    driver.find_element_by_css_selector("input[id='kw']").send_keys('demo')

    8.3CSS的父类属性和层级定位方法(和xpath区分开 用的也比较多)

    driver.find_element_by_css_selector("span#s_ipt_wr>input.s_ipt").send_keys('demo')

    8.4CSS的爷爷属性和层级定位方式

    driver.find_element_by_css_selector("form#form>span>input").send_keys('demo')

    登录sina邮箱发邮件实战:

    1.手动注册一个新浪邮箱http://mail.sina.com.cn/

    2.模拟用户输入账号和密码

    3.模拟用户点击登录按钮

    4.输出 Login is ok---------->

    5.点击写信----->收件人----->主题----->写入内容(收件人为同桌的邮箱账号)

    (定位过程中多使用css定位,少用xpath)

    元素定位注意事项:

    定位前先思考:

    a.有id属性优先使用id定位。没有id的尽量使用css、xpath定位。

    b.Xpath/CSS/定位的灵活运用

    c.对HMTL各类标签代表的含义补充学习

    d.一个定位方式行不通,可以多尝试其他的定位方式(不要一个树上吊死)

    e.元素的属性值如果数字、动态变化的,你应该放弃使用该属性

    脚本中检查:

    1.脚本的上下文是否引入sleep 增强脚本稳定性

    2.元素的属性值是否唯一

    3.元素的属性值是否真实可见 is_displayed()

    4.元素是否在iframe框架中?

    5.元素定位方式需要改变

    6.元素是否真正定位到是真正的元素

    7.网络环境是否良好

    8.Web页面操作前后页面关联是否是否检查过?思考过?

    9.定位元素的代码是否是正常的 比如代码敲错了 或者是否引入了相关的模块 没加相关的声明 #coding=utf-8?

    10.认真检查控制台的报错信息 代码报错行数

    六、Webdriver api 继续

    1.控制浏览器

    .maximize_window() 最大化浏览器窗口

    .set_window_size(a,b) a、b代表的浏览器的长宽

    .forword()    前进操作

    .back() 后退操作

    .refresh() 模拟F5刷新

    代码示例:

    from time import sleep

    from selenium import webdriver

    driver = webdriver.Chrome() #调用谷歌浏览器驱动

    driver.get("https://www.baidu.com") #访问百度站点

    sleep(3)

    driver.maximize_window() #最大化窗口

    sleep(4)

    driver.find_element_by_link_text(u'新闻').click()

    sleep(3)

    driver.back() #返回百度首页

    print driver.current_url #获取url

    sleep(3)

    driver.forward() #前进新闻页面

    print driver.current_url #获取url

    sleep(5)

    driver.refresh() #模拟浏览器刷新

    sleep(5)

    driver.set_window_size(900,900) #设置浏览器长和宽

    sleep(3)

    driver.quit() #关闭浏览器

    2.webdriver 常用操作方法

    .click() 点击事件

    .send_keys() 向文本框输入内容

    .quit() 关闭所有浏览器窗口

    .close() 只关闭当前窗口

    .clear() 清空

    3.webdriver常用接口方法

    .text 获取元素对应文本.is_displayed() 检查元素是否用户可见实例:demo = driver.find_element_by_id('kw').size #文本框的尺寸print demodemo = driver.find_element_by_id('cp').text #打印元素对应的文本print demodemo = driver.find_element_by_id('kw').is_displayed() #检查元素是否用户可见print demo4.获取验证信息    webdriver提供了三种验证信息的方法,也叫断言。根据测试用例中的描述的规程一步一步的执行测试用例,在最后会将测用例的实际结果很预期结果进行比较,这种方式在自动化测试中叫:断言。.url (由句柄提供).text (由元素定位提供).title (由句柄提供)#text 获取元素对应的文本进行断言text = driver.find_element_by_css_selector('span[class="nick"]').textif text == 'luruifengx@sohu.com':print 'login is ok--------------->'else:print 'login is error---------------->'#title 窗口标题title = driver.titleif title == u'我的通行证':print 'login is ok--------------->'else:print 'login is error---------------->'#url 通过url做断言url = driver.current_urlif url == u'https://passport.sohu.com/mypassport/index':print 'login is ok--------------->'else:print 'login is error---------------->'

    5.设置元素等待

    sleep(S) Python的time模块提供的方法 强制等待

    .implicitly_wait(S) 是webdriver提供的隐式等待 (比较温柔,这个用法和网络传输速度有关系,比较智能一些对比强制等待

    原理是:在规定时间内比如设置60S,那么假如在运行第10S元素访问到了则会继续往下执行脚本,否则将以轮询的方式不断的去判断元素是否被加载出来)

    6.上传文件

    webdriver中的send_keys()支持上传文件

    该操作只能针对的是标签 input 标签 使用方法:send_keys('上传本地文件的路径')

    driver.find_element_by_name("file").send_keys("上传本地文件所在路径")

    7.JS操作浏览器滚动条

    调用js代码实现

    excute_script("window.scrollTo(0,2500);") 从最顶端拉到最下面(实际项目中最常用)2500为一般参考值,具体要看需求,有的可能1000就到滚动条的底部

    driver = webdriver.Chrome()

    driver.get("https://www.baidu.com")

    driver.find_element_by_id("kw").send_keys("python")

    driver.set_window_size(800,600)

    driver.find_element_by_id("su").click()

    time.sleep(5)

    driver.execute_script("window.scrollTo(0,2500);") #上---->下

    time.sleep(5)

    driver.execute_script("window.scrollTo(2500,0);") #下---->上

    driver.execute_script("window.scrollTo(900,900);") #从上网下 从左往右 同时拖动

    8.多窗口切换

    句柄.switch_to.window(句柄.window_handles[1]) #跳转到第二个窗口

    switch_to.window 切换窗口

    window_handles[1] [1] 代表的是切换到第二个窗口

    window_handles[2] [2] 代表的是切换到第三个窗口

    9.下拉框处理

    有三种定位策略   

    1. 引入一个Select类 (下拉框的实现必须是select标签才可以使用1方法)

    from selenium.webdriver.support.select import Select 引入select类

    Select(demo).select_by_index(2) #通过索引

    Select(demo).select_by_value('2') #通过value值

    Select(demo).select_by_visible_text(u'审核不通过') #通过文本描述

    time.sleep(5)

    2.链式定位

    第一步:先定位下拉框大标签,将定位的结果赋值给一个变量demo

    第二步:拿着第一步中赋值好的demo,直接操作下拉框里面的选项

    demo = driver.find_element_by_name('status')

    demo.find_element_by_css_selector("option[value='1']").click()

    3.一步到位法

    driver.find_element_by_name('status').find_element_by_css_selector("option[value='1']").click()

    driver.find_element_by_name('status') #定位下拉框

    find_element_by_css_selector("option[value='1']").click() 选择里面的选项

    10.警告框的处理

    有三种表现形式:

    1.alert 只有一个确定按钮

    2.confirm 有一个确定按钮和一个取消按钮

    3.prompt() 有一个确定按钮和一个取消按钮,还有一个文本框

    以上三种统一的定位方式如下:

    句柄.switch_to.alert.accept( ) 接收弹窗

    句柄.switch_to.alert.dismiss( ) 拒绝弹窗

    11.多框架iframe处理

    有两种形式: 1.平行框架 2.嵌套框架

    1.iframe标签本身有id/name的情况   

    句柄.switch_to.frame('id或者name的属性值') 然后继续操作下面的步骤即可。

    2.iframe标签本身有id/name的情况

    a.先使用Xpath定位到iframe标签,将结果赋值给一个变量demo

    b.使用a中定义好的变量执行下面的语句 句柄.switch_to.frame(demo)

    demo=driver.find_element_by_xpath('//*[@id="f1"]') #先定位大框架 (demo为变量名字)

    driver.switch_to.frame(demo)

    demo=driver.find_element_by_xpath('//*[@id="f2"]') #再定位小框架

    driver.switch_to.frame(demo)

    3.框架有进入就要有退出(除嵌套框架以外)----针对是平行框架

    句柄.switch_to.default_content()

    七、面向对象编程(三大特点:继承/多态/封装)

    1.类定义:类是一个具有相同属性或者方法的集合。

    2.类的写法:

    a.定义类的关键字:class

    b.类的关键字后面跟的是类的名字,类的首字母一般是 大写 class Student():

    pass #如果这个类什么都不做 使用pass表示

    c.类下面的def (函数)我们叫类方法,不叫函数。类方法中的第一个参数是self,self代表的是类本身自己属性。

    self一定要写在类方法中的第一个位置,在进行传参的时候,我们可以不对self传参。

    d.访问类下面的属性时通过创建化对象进行访问,如果在创建类的时候,给类强制性的绑定一些属性以后,这时访问类的时候

    需要进行对应的传参。

    #代码示例

    class Stundent():

      pass

    bart = Stundent() #创建一个实例对象

    print bart #查看创建实例对象所在计算机内存位置

    bart.name = 'zhangshan'

    print bart.name

    3.类的初始化 __init__方法

    #代码示例

    class Student():

    def __init__(self,name,age):

      self.name = name

      self.age = age

    demo = Student('zhaoming',250)

    a = demo.name

    b = demo.age

    print a,b

    class Student():

    def __init__(self,name,age):

      self.name = name

      self.age = age

    def print_message(self):

      print 'hello,{} my age is {}'.format(self.name,self.age)

    demo = Student('zhaoming',250)

    demo.print_message()

    4.类的继承

    class Animals():

    def running(self):

      print "Animals is running---------------->"

    class Dog(Animals):

      pass

    real_demo = Dog()

    print real_demo

    real_demo.running() #访问animals下面的running方法

    class Animals():

      def running(self):

        print "Animals is running---------------->"

    class Dog(Animals):

      def singsing(self):

        print 'dog is singsing+++++++++++++++>'

    if __name__ == "__main__":

      real_demo = Dog()

      real_demo.running() #访问animals下面的running方法

      real_demo.singsing()

    5.学生成绩封装 (函数对比类实现)  函数式编程 面向整个过程 注重的功能的实现

    std1 = {'name':'zhangshan','score':150}

    std2 = {'name':'lukuncai','score':100}

    def print_score(std):

        print "student:{},score:{}".format(std['name'],std['score'])

        print_score(std1)

        print_score(std2)

    面向对象编程把学生看做一个类,学生有name score属性 print_score功能

    class Student(object):

    def __init__(self,name,score):

        self.name = name

        self.score = score

    def print_score(self):

        print "student:{},score:{}".format(self.name,self.score)

    if __name__=='__main__':

        demo1 = Student('zhangshan',150)

        demo2 = Student('lukuncai',100)

        print demo1,demo2

        demo1.print_score()

    八、unittest单元测试框架

    每一种开发语言都有自己的原生的单元测试框架。

    (pyunit)unittest --------> Python语言内部的一个单元测试框架

    pytest --------> Python语言内部的单元测试框架

    TestNg、Junit --------------->Java语言的原生框架

    1.unittest单元测试框架好处

    a.提供用例的组织和管理

    b.提供丰富的断言方法

        assertIn(a,b)

        assertEqual(a,b)

        assertTrue(a)

        assertIs(a,b)

    ..............

    c.提供丰富的日志(执行的测试用例数量,通过数有多少,失败数量有多少,环境信息)

    2.unittest单元测试框架组成

    import unittest #导包unittest

    class Leiming(unittest.TestCase):

        #定义一个测试类 类名Leiming 继承unittest.TestCase

        def test_Add(self): #test method names begin 'test*'

            #测试用例的开头必须以test test后面跟什么不需要关注

            self.assertEqual(3, 3)

            #assertEqual(a,b) 断言的函数 由TestCase提供,表示a是否等于b

        def test_Multiply(self):

            self.assertEqual(10, 0)

    if __name__ == '__main__':#作用是用来运行整个模块的主函数

        unittest.main()

    #.main方法是unittest下面提供的方法 用来运行整个测试用例中以test开头的测试用例

    3.自动化测试用例执行顺序

    0-9数字优先----->其次A-Z大写字母------>最后a-z小写字母

    import unittest

    class Test(unittest.TestCase):

        def test123Add(self):

            print '第一次打印------------->'

        def test123Aub(self):

            print '第一次打印+++++++++++++>'

        def test123(self):

            print '第一次打印%%%%%%%%%%%%%%'

    if __name__=="__main__":

    unittest.main()                   

    4.前置条件和后置条件

    前置:setUp()

    后置:tearDown( )

    前置指的是:比如打开浏览器、最大化窗口、休眠等一系列动作,都可以看做是前置。

    后置指的是:执行完测试用例,数据还原,浏览器的关闭等操作。

    前置和后置属于非必要条件,如果在前置条件和后置条件什么都不做,用pass 表示。但是一般写自动化测试脚本必须要有前置和后置。结构清晰、组织代码正常运行。

    import unittest

    class Test(unittest.TestCase):

    def setUp(self):

        print '111111111111111111111111111111'

    def test123Add(self):

        print '第一次打印------------->'

    def test123Aub(self):

        print '第一次打印+++++++++++++>'

    def test123(self):

        print '第一次打印%%%%%%%%%%%%%%'

    def tearDown(self):

        print '00000000000000000000000000000000'

    if __name__=="__main__":

        unittest.main()

    运行看效果。

    5.unittest单元测试框架之--断言

    什么是断言?

    在编写用例的过程中,不管用例的执行过程是怎样的,最初都会有一个预期结果,用例的执行就是通过执行用例的步骤,验证实际的结果是否与预期结果相等。unittest 框架的 TestCase 类提供一些方法用检查比较和报告失败。

    assertEqual(a,b) ----------判断a是否等于b

    assertNotEqual(a,b)    --------判断a是否不等于b

    assertIn(a,b) -------- 判断a是否在b中

    assertNotIn(a,b)    --------判断a是否不在b中

    assertTrue(x)    --------判断x是否为真

    assertFalse(x)    --------判断x是否为假

    assertIs(a,b) -------- 判断a是否是b

    6.整合百度/有道测试用例到uniitest单元测试框架

    import unittest,time

    from selenium import webdriver

    class Test_baidu_search(unittest.TestCase):

    def setUp(self):

    self.driver = webdriver.Chrome()

    self.base_url = 'https://www.baidu.com'

    self.driver.implicitly_wait(30)

    self.driver.maximize_window()

    def test_baidu(self):

    '''百度搜索测试用例'''

    driver = self.driver

    driver.get(self.base_url)

    driver.find_element_by_css_selector('#kw').send_keys('demo')

    driver.find_element_by_css_selector('#su').click()

    time.sleep(3)

    title = driver.title

    self.assertEqual(title,u'demo_百度搜索')

    def test_youdao(self):

    '''有道搜索测试用例'''

    driver = self.driver

    driver.get('http://www.youdao.com/')

    driver.find_element_by_name("q").clear()

    driver.find_element_by_name("q").send_keys("webdriver")

    driver.find_element_by_xpath("//*[@id='form']/button").click()

    time.sleep(2)

    driver.find_element_by_xpath("html/body/div[7]/i/a[1]").click()

    text01 = driver.find_element_by_css_selector("span[class='keyword']").text

    self.assertEqual(text01,'webdriver')

    def tearDown(self):

    self.driver.quit()

    if __name__ == '__main__':

    unittest.main()

    7.引包机制

    同级引包

    跨目录引包

    pub.py下面的代码:

    def add(a,b):

          return a+b

    def sub(a,b):

        return a-b

    笔者创建了一个测试交流群,如果对软件测试、接口测试、自动化测试、面试经验交流感兴趣可以加测试交流群:829792258,还会有同行一起技术交流

    相关文章

      网友评论

        本文标题:一步到位—带你入门Selenium

        本文链接:https://www.haomeiwen.com/subject/bbmeqktx.html