zoukankan      html  css  js  c++  java
  • Seleniumweb自动化测试01

    1、selenium简介

    selenium是python的一个web第三方包,主要使用来做web自动化测试的

    环境要求:

    ①、要有谷歌浏览器

    ②、下载谷歌浏览器的驱动chromedriver(驱动我们操作网页的):

    首先需要找到谷歌浏览器的版本号(三个点--->帮助--->关于Google chrome)

    再下载对应版本号的驱动文件,网址:http://npm.taobao.org/mirrors/chromedriver/

                             

    ③、安装selenium,以管理员身份打开cmd,输入以下命令:pip3 install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple

    2、步骤

    2.1、新建文件夹seleniumtest,并且将刚才解压的驱动文件copy进去

              

    注意,这里取名字的时候,不能取和第三方包名字相同的文件夹,不然导入的时候会出问题

    2.2、导入第三方包及驱动:

    from selenium import webdriver

    2.3、代码实现操作浏览器

    2.3.1、打开浏览器:实例化浏览器句柄(把柄)

    web自动化其实就相当于是用代码实现操作整个网页的过程,要想操作一个网页,首先肯定是要打开这个网站
    #1、打开浏览器:实例化浏览器句柄(把柄)
    driver = webdriver.Chrome(executable_path="chromedriver.exe")

    注意,这里有坑:Chrome,是大写的C

    driver:浏览器操作对象(句柄/把柄)

    executable_path:浏览器驱动文件路径:右键-复制相对路径

    句柄(把柄):有了这个浏览器的把柄,让它干嘛就干嘛了,神奇

    运行代码之后会自动打开浏览器,但是还什么都没有,只是打开浏览器这么一个操作,而且浏览器窗口不会自己关闭,需要手动关闭

    2.2.3、访问网站:用把柄去访问网站

    这里使用get类型接口,去访问百度网站

    #2、访问网站:用把柄去访问网站,get类型接口
    driver.get("https://www.baidu.com")

    注意先前运行打开的网页是不会自动关的,必须要手动关

    2.2.3、模拟执行测试用例过程

    打开了百度之后,肯定会想着在百度搜索框里输入内容再进行搜索,所以这里分为了两步,第一步输入文字,第二步点击搜索按钮

    这里还需要补充点前置知识:

    什么是网页元素:网站上的所有东西都是网页元素,通常情况下有以下内容

    • 输入框:input

    • 按钮:button/input

    • 图片:img

    • 超链接:a

    • 样式:div

    怎样去查看网页元素:用谷歌浏览器自带的开发者工具查看(element)

    常用方法:

    • 输入内容:元素对象.send_keys("内容")

    • 点击:元素对象.click()

    • 关闭测试,退出浏览器:driver.quit()(测试的时候浏览器是不会自动关闭的,调用这个方法就可以实现用完之后自动关闭,写在代码最后边就行)

    • 打开浏览器时全屏显示:driver.maximize_window()(将这段代码加在打开浏览器代码后边,就可以实现打开浏览器时显示全屏)

    • 获取元素的文本值:元素.text

    2.3.3.1、输入文字

    如果需要用selenium去操作元素的话,首先就要去定位元素,这里就涉及到了八大定位方式

    还是一样的,在谷歌浏览器里打开开发者工具,然后点击左上角小箭头,在页面上选择,会自动定位到代码上

     copy——copy element:这样就可以得到源码。例如选择了百度的输入框,复制源码:

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

    ①、通过id值定位:

    driver.find_element_by_id('kw').send_keys("hello 明天")

    find_element_by_id()是selenium提供的方法

    send_keys()是在输入内容

    这段代码运行之后就会去打开百度网站并且定位到输入框这个元素,发送输入的内容,但是在这块是没有结果的,因为还没有点击百度一下这个按钮嘛

    Ctrl+Shift +C:快速打开开发者工具定位元素

    ②、通过xpath定位

    找到源码,右键copy——copy xpath

    从网页上copy到的xpath://*[@id="kw"]

    driver.find_element_by_xpath('//*[@id="kw"]').send_keys("hello,明天")

    这里注意引号不相同原则,源码上的xpath有双引号,在方法里边就用单引号

    ③、通过name定位

    首先还是要先复制网页的源码:

    <input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
    driver.find_element_by_name('wd').send_keys("hello 明天")

    注意:这里VScode代码提醒有个坑,是find_element_by_name而不是elements,之后的定位元素也是一样的道理

    ④、通过calssname定位

    首先还是要先复制网页的源码:

    <input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
    driver.find_element_by_class_name('s_ipt').send_keys("hello 明天")

    ⑤、通过css selector定位

    找到输入框的源码,右键copy——copy selector

    从源码上复制的selector:#kw

    driver.find_element_by_css_selector('#kw').send_keys("hello 明天")

    ⑥、通过超链接定位

    网页上源码以a开头的就是超链接,找到源码,copy——copy element

    <a href="http://news.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">地图</a>
    driver.find_element_by_link_text('地图').click()

    ⑦、一部分文字定位超链接

    首先还是要先拿到源码的,copy——copy element

     <a href="http://map.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">地图</a>
    driver.find_element_by_partial_link_text('').click()

    ⑧、通过tag name定位:即标签做左边的那个元素,比如这里就是input

    driver.find_element_by_tag_name('input')

    这个方法有很多坑,非常不推荐使用

    注意:以上定位之所以能跳转页面,是因为还执行了下边的.click()方法

    2.3.3.2、点击搜索按钮

    首先还是要先定位到搜索按钮才能进行点击,按钮源码为(右键copy——copy element):

    <input type="submit" id="su" value="百度一下" class="bg s_btn">

    这里也是用的通过id值定位

    driver.find_element_by_id('su').click()

    可以发现百度网站输入了指定的内容并且跳转成功搜索出结果了

    注意:定位元素能用id就用id,不能用id就尽量用xpath

    在开发者工具中双击并复制也可以将id值等元素复制下来,这样就可以不用每次都先把源码给复制下来了

    3、元素查找机制

    3.1、当找不到一个元素的时候

    比如说现在通过id查找一个不存在的东西

    driver.find_elements_by_id('cdhsvibvjdln.vlNV')

    点击运行,会发现报异常

    注意这里怎么去看报错的原因:哪一个代码是你写的,肯定就是那句代码报错嘛,比如此处的第十四行代码报错

    3.2、当找到元素的时候,会返回网页元素的类型

    用一个变量把找到的元素接收起来,再把它打印出来

    终端打印出了网页元素的类型

    4、练习:

    流程:在shopx商城输入框中输入包包,点击搜索按钮,跳转页面

    from selenium import webdriver
    
    #1、打开浏览器:实例化浏览器句柄(把柄)
    #注意,这里有坑:Chrome,是大写的C
    #driver:浏览器操作对象(句柄/把柄)
    #executable_path:浏览器驱动文件路径:右键-复制相对路径
    driver = webdriver.Chrome(executable_path="chromedriver.exe")
    #浏览器全屏显示
    driver.maximize_window()
    
    #2、访问网站:用把柄去访问网站,get类型接口
    driver.get("http://118.24.255.132:9090/shopxo/")
    
    # 3、模拟测试用例的执行过程
    #3.1、输入文字
    # <input id="search-input" name="wd" type="text" placeholder="其实搜索很简单^_^ !" value="" autocomplete="off">
    driver.find_element_by_id('search-input').send_keys('包包')
    
    #3.2、点击搜索按钮
    #<input id="ai-topsearch" class="submit am-btn" index="1" type="submit" value="搜索">
    driver.find_element_by_id('ai-topsearch').click()

    5、断言

    就如上边,找出了包包之后,这里又引申出一个问题,怎样判断测试用例的结果,即判断这个结果是否存在,自动化中用断言实现这样的过程

    两种方式,第一种通过文本值断言,第二种通过元素是否存在断言

    5.1、通过文本值断言

    先把正确的结果查找元素(有id值就用id值,没有id值就用xpath)

    这里搜索出来的场景是一个包包,查找元素的时候注意找的是这个商品名字,不要找成商品图片啥的

    断言即判断搜索出来的结果是否等于正确的商品名即可

    # xpath:/html/body/div[4]/div/ul/li/div/a/p
    
    res = driver.find_element_by_xpath('/html/body/div[4]/div/ul/li/div/a/p')
    
    assert res.text == '纽芝兰包包女士2018新款潮百搭韩版时尚单肩斜挎包少女小挎包链条'

    由此可见,页面正常打开

    如果有多个商品,即是个列表的话,那就找多次,在断言里边加and即可

    5.2、通过元素是否存在断言

    断言判断的第二种方式:判断元素是否存在即可(可以判断多个元素)

    这会用到一个方法:driver.find_elements_by_id/xpath(八大定位方式均可)(注意这里是elements了)

    这个方法的返回值是列表格式,有多少个元素就返回多少个:[元素1,元素2....]

    e = driver.find_elements_by_id('search-input')
    
    print(e)

    如果使用这种方法,直接用len()方法就可以断言判断

    e = driver.find_elements_by_id('search-input')
    
    # print(e)
    
    assert len(e) != 0

    如果没有元素,那就返回空列表

    6、复习

    用jmeter跑,模拟网站变卡

    线程数设置为50之后,此时网站开始明显卡顿

    7、设置等待

    以网站的登录为例:

    打开登录页面之后,Ctrl+Shif+C开始定位元素

    怎样断言登录成功:定位首页这个元素

    from selenium import webdriver
    
    
    
    #1、打开浏览器:实例化浏览器句柄(把柄)
    
    driver = webdriver.Chrome(executable_path="chromedriver.exe")
    
    #浏览器全屏显示
    
    driver.maximize_window()
    
    
    
    #2、访问网站:用把柄去访问网站,get类型接口
    
    driver.get("http://118.24.255.132:9090/shopxo/admin.php")
    
    
    
    #3、模拟测试用例的执行过程
    
    driver.find_element_by_name('username').send_keys('admin')
    
    driver.find_element_by_name('login_pwd').send_keys('shopxo')
    
    driver.find_element_by_xpath('/html/body/div[1]/div/div[2]/div/form/div/div[3]/button').click()
    
    
    
    res = driver.find_element_by_xpath('//*[@id="admin-offcanvas"]/div/ul/li[1]/a/span[2]')
    
    assert res.text == '首页'

    右上角点击运行之后发现报错了

    明明运行的时候网页都是正常的,但是在终端发现报错,报错的原因显示如下:

    原因就是,因为网站在登录的时候本身服务器也不好,网速也不行,在登录的时候存在着装券和停留的时刻,但是代码在运行的时候是不会停留的,代码上一句没有报错就紧接着会执行下一句代码,代码运行是非常快的,它不会顾及网页是什么情况。

    所以代码在找 “首页” 这个元素的时候,很可能网页还正在登录页面没有进去首页,这就出现了时间差(代码执行得过快,网页很慢)

    这就涉及到一个等待的问题,一般而言,有网页跳转和元素动态加载的时候需要等待

    处理方式主要有三种

    7.1、固定(静态)等待:time.sleep(),使用时需要先导入,是python自带的包:import time

    方法括号中间给一个int或者float类型的数

    python自带的库(包):https://www.runoob.com/python3/python3-stdlib.html

    7.2、隐式等待:会智能判断网页是否加载完成:driver.implicitly_wait()

    括号中间也是int或者float类型的数字

    比如:driver.implicitly_wait(5),在前三秒的时候网页加载好了,那剩下的2秒就不会再继续等待了,但是若超过5秒还没好,那也管不了了

    7.3、显式等待:这个是在做自动化的时候最经常用到的

     

  • 相关阅读:
    ES6中的基础语法
    let和const、var
    iframe框架
    ajax
    面试题
    移动端的点击延迟事件
    移动端如何设置字体
    swiper插件以及简介
    第十二章 systemctl管理脚本
    第十一章 awk命令
  • 原文地址:https://www.cnblogs.com/bzbz/p/14011839.html
Copyright © 2011-2022 走看看