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、显式等待:这个是在做自动化的时候最经常用到的

Seleniumweb自动化测试01的更多相关文章

  1. Python接口自动化测试01

    1)环境准备: 接口测试的方式有很多,比如可以用工具(jmeter,postman)之类,也可以自己写代码进行接口测试,工具的使用相对来说都比较简单,重点是要搞清楚项目接口的协议是什么,然后有针对性的 ...

  2. 2020软件测试自学全套教程-基于python自动化软件测试-2020新版软件测试中级程序员学习路线

    不知不觉间,在软件测试行业野蛮的折腾了七年之久.七年之痒也即将过去,但我还是热爱着软件测试这一份工作,一路坚持,走到现在.经历过各种难题,有过迷茫,有过焦虑失眠.也踩过无数的坑,深知行业的不易.自从9 ...

  3. Java自动化测试框架-01 - TestNG之入门篇 - 大佬的鸡肋,菜鸟的盛宴(详细教程)

    TestNG是什么? TestNG按照官方的定义: TestNG是一个测试框架,其灵感来自JUnit和NUnit,但引入了一些新的功能,使其功能更强大,使用更方便. TestNG是一个开源自动化测试框 ...

  4. Pytest自动化测试-简易入门教程(01)

    我们今天主讲的内容,就是测试框架Pytest,讲到这个测试框架对于没有做过Web自动化的伙伴来说,会觉得这个东西是陌生的,那么到底什么是框架呢?什么又是自动化呢?自动化为什么又要用框架呢? 难道我学自 ...

  5. Android-Junit-Report测试报告生成——Android自动化测试学习历程

    视频地址: http://www.chuanke.com/v1983382-135467-384869.html 这个内容其实已经在用了,我在上一篇文章robotium—只有apk文件的测试中已经讲过 ...

  6. [小北De编程手记] : Lesson 01 - Selenium For C# 之 环境搭建

    在我看来一个自动化测试平台的构建,是一种很好的了解开发语言,单元测试框架,自动化测试驱动,设计模式等等等的途径.因此,在下选择了自动化测试的这个话题来和大家分享一下本人关于软件开发和自动化测试的认识. ...

  7. QTP之delphi试用感想一(自动化测试)

    这两天一直在琢磨自动化测试,自动化测试,其实与单元测试有一些相同之处,单元测试的目的也是可以一次写,多次运行,对于测试驱动及后期维护真是有非常多的好处,用自动化测试工具也是如何,主要目的是为了回归测试 ...

  8. 基于Selenium2与Python自动化测试环境搭建

    简介: selenium 是一个web的自动化测试工具,不少学习功能自动化的同学开始首选selenium ,相因为它相比QTP有诸多有点: *  免费,也不用再为破解QTP而大伤脑筋 *  小巧,对于 ...

  9. [小北De编程手记] Lesson 01 - AutoFramework构建 之 从一个简单的Demo聊起

    写在最前面 这个系列的主旨是要跟大家分享一下关于自动化测试框架的构建的一些心得.这几年,做了一些自动化测试框架以及团队的构建的工作.过程中遇到了很多这样的同学,他们在学习了某一门语言和一些自动化测试的 ...

  10. SoapUI实践:自动化测试、压力测试、持续集成

    因为项目的原因,前段时间研究并使用了 SoapUI 测试工具进行自测开发的 api.下面将研究的成果展示给大家,希望对需要的人有所帮助. SoapUI 是什么? SoapUI 是一个开源测试工具,通过 ...

随机推荐

  1. WSL优化之SSH远程登录篇

    Some of the most devastating things that happen to you will teach you the most. 有些最打击你的事情反而教会你的东西越多. ...

  2. 硬核!Apache Hudi Schema演变深度分析与应用

    1.场景需求 在医疗场景下,涉及到的业务库有几十个,可能有上万张表要做实时入湖,其中还有某些库的表结构修改操作是通过业务人员在网页手工实现,自由度较高,导致整体上存在非常多的新增列,删除列,改列名的情 ...

  3. Day26:内部类的详解

    内部类 1.1内部类概述 内部类:就是在一个类中定义另外一个类. 例如我们在A类中定义一个B类,那么B类就是A类的内部类,A则是B的外部类. 好比我们的手机是一个类,而手机内部的零件又属于一个类. 内 ...

  4. 【Shell案例】【awk匹配、grep查找文件内的字符串】6、去掉空行(删除空行)

    描述写一个 bash脚本以去掉一个文本文件 nowcoder.txt中的空行示例:假设 nowcoder.txt 内容如下:abc 567 aaabbb ccc 你的脚本应当输出:abc567aaab ...

  5. 大规模爬取(新浪为例子)网页之downloader、parser的封装(涉及编码等细节)

    import requests import cchardet import traceback from lxml import etree def downloader(url,timeout = ...

  6. 真正“搞”懂HTTP协议06之body的玩法(理论篇)

    本来啊,本来,本来我在准备完善这个鸽了四年的系列的时候,是打算按照时间的顺序来完成的,好吧.我承认那个时候考虑的稍稍稍稍稍微有些不足,就是我忽略了HTTP协议的"模块性".因为虽然 ...

  7. Spring IOC源码(二):IOC容器之 刷新前的准备

    1.源码解析 prepareRefresh()容器刷新refresh()的第一个方法,是容器刷新前的准备工作. 1 // 容器启动的开始时间 毫秒级 2 private long startupDat ...

  8. 为什么 Random.Shared 是线程安全的

    在多线程环境中使用 Random 类来生成伪随机数时,很容易出现线程安全问题.例如,当多个线程同时调用 Next 方法时,可能会出现种子被意外修改的情况,导致生成的伪随机数不符合预期. 为了避免这种情 ...

  9. 互斥锁 线程理论 GIL全局解释器锁 死锁现象 信号量 event事件 进程池与线程池 协程实现并发

    目录 互斥锁 multiprocessing Lock类 锁的种类 线程理论 进程和线程对比 开线程的两种方式(类似进程) 方式1 使用Thread()创建线程对象 方式2 重写Thread类run方 ...

  10. MySQL单表查询(分组-筛选-过滤-去重-排序-分页-判断-正则)

    目录 一:单表查询 1.单表查询(前期准备) 2.插入记录(写入数据) 3.查询关键字 二:查询关键字之where 1.查询id大于等于3小于等于6的数据 2.查询薪资是20000或者18000或者1 ...