WEB自动化测试笔记完整整理

直接等待

强制等待,线程休眠一段时间

from  time  import  sleeptime.sleep(3)

隐式等待

设置一个等待时间,轮询查找元素是否出现,如果没有出现抛出异常

self.driver.implicitly_wait(3)

显式等待

在代码中定义等待条件,当条件发生时才继续执行代码。

WebDriverWait配合until()或until_not(),根据判断条件进行等待。

程序每隔一段时间(默认为0.5秒)进行条件判断,如果条件成立,执行下一步,如果条件不成立,一直等待至超时。

'''
等待方式练习
'''
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWaitclass PractWait:def setup(self):self.driver = webdriver.Chrome()    #初始化浏览器self.driver.implicitly_wait(3)      #隐式等待三秒def teardown(self):self.driver.quit()                 #关闭浏览器def test_wait(self):self.driver.get("https://www.baidu.com/")            self.driver.find_element(By.ID,"kw").click()           #定位元素self.driver.find_element(By.ID,"kw").send_keys("测试")     #输入查询文字# def wait(x):                                        这里可以通过定义函数的方式来确定一个显式等待的条件#     return len(self.driver.find_element(By.ID,))>1#添加显式等待的条件,后面是条件:期望条件,xxx元素被点击WebDriverWait(self.driver,0.5).until(expected_conditions.element_to_be_clickable(By.CSS_SELECTOR,''))

控件定位,元素查找

xpath定位方式

需要注意的是:/bookstore//book[2]后面有两个/,指的是bookstore下的子孙元素。

页面元素查找方式

使用xpath方式定位

使用CSS方式定位元素

这里css定位方式采用直接输入id=kw方式或者是使用简写的方式都是可以正常查找到元素的

注意:前面写好id的定位属性后,需要用空格后添加子孙元素a的定位,其中nth-child(2)指的是:子孙元素的第二个

多窗口处理方式

获取当前窗口的句柄:driver.current_window_handle获取所有窗口的句柄:driver.window.handles

演示代码:

'''
窗口切换方式
'''
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleepclass PractWait:def setup(self):self.driver = webdriver.Chrome()self.driver.implicitly_wait(3)def teardown(self):self.driver.quit()def test_wait(self):self.driver.get("https://www.baidu.com/")self.driver.find_element(By.LINK_TEXT,'登录').click()#打印当前窗口句柄print(self.driver.current_window_handle)# 打印全部存在的句柄print(self.driver.window_handles)self.driver.find_element(By.LINK_TEXT, '立即注册').click()# 定义全部的句柄windows = self.driver.window_handles# 切换窗口句柄到最后一个self.driver.switch_to_window(windows[-1])self.driver.find_element(By.ID,'TANGRAM__PSP_4__userName').send_keys('username')self.driver.find_element(By.ID,'TANGRAM__PSP_4__phone').send_keys('13800000000')sleep(2)#切换窗口句柄到第一个self.driver.switch_to_window(windows[0])self.driver.find_element(By.ID, 'TANGRAM__PSP_11__userName').click()self.driver.find_element(By.ID, 'TANGRAM__PSP_11__userName').send_keys('13800000000')self.driver.find_element(By.ID, 'TANGRAM__PSP_11__password').click()self.driver.find_element(By.ID, 'TANGRAM__PSP_11__password').send_keys('123456')sleep(3)

页面框架frame介绍

多frame之间切换

frame框架存在两种:一种是嵌套式的,一种是非嵌套式的

self.driver.switch_to_frame()                   #根据id,或者是index切换frame
self.driver.switch_to.default_content()         #切换到默认frame
self.driver.switch_to.parent_frame()            #切换到父级frame

演示代码:

def test_frame(self):self.driver.get("https://www.runoob.com/try/try.php?filename=jqueryui-api-dropable")#切换框架到iframeResultself.driver.switch_to_frame("iframeResult")print(self.driver.find_element(By.ID,'draggable').text)#切换回默认框架self.driver.switch_to_default_content()print(self.driver.find_element(By.ID,'submitBTN').text)

多浏览器切换

先创建一个base.py的文件进行基础类的创建

'''
窗口切换
'''
from selenium import webdriver
import osclass Base():def setup(self):browser = os.getenv("browser")if browser == "Firefox":self.driver = webdriver.Firefox()elif browser =="headless":self.driver = webdriver.PhantomJS()else:self.driver = webdriver.Chrome()self.driver.implicitly_wait(3)def teardown(self):self.driver.quit()

然后进行类继承

class Pract(Base):def test_frame(self):self.driver.get("https://www.runoob.com/try/try.php?filename=jqueryui-api-dropable")#切换框架到iframeResultself.driver.switch_to_frame("iframeResult")print(self.driver.find_element(By.ID,'draggable').text)#切换回默认框架self.driver.switch_to_default_content()print(self.driver.find_element(By.ID,'submitBTN').text)

然后可以在pycharm的控制台输入:browser = chrome pytest test_frame.py进行运行代码

执行JavaScript脚本

这里进行继承base类中定义的方法

from selenium.webdriver.common.by import By
from base.base import Base
from time import sleep
class JsExecute(Base):def test_js(self):self.driver.get("https://www.baidu.com/")self.driver.find_element(By.ID,'kw').click()self.driver.find_element(By.ID,'kw').send_keys("selenium测试")#执行百度一下按钮的js脚本element = self.driver.execute_script("return document.getElementById('su')")element.click()#执行滑动页面的脚本self.driver.execute_script("document.documentElement.scrollTop=10000")sleep(2)def test_datatime(self):self.driver.get("https://www.12306.cn/index/")#查找到时间控件的js,以及属性time_element = self.driver.execute_script("a=document.getElementById('train_date');a.removeAttribute('readonly')")# 执行去除readonly属性self.driver.execute_script(time_element)#修改时间为2020-12-30self.driver.execute_script("document.getElementById('train_date').value='2020-12-30'")sleep(3)#打印执行脚本返回的value值print(self.driver.execute_script("return document.getElementById('train_date').value"))

文件上传

input标签可以直接进行send_keys(文件地址)上传文件

class FileUpload(Base):def test_fileupload(self):self.driver.get("https://www.baidu.com/")self.driver.find_element(By.XPATH,'//*[@id="sttb"]/img[1]').click()self.driver.find_element(By.ID,'stfile').send_keys("文件上传的路径")sleep(3)

弹窗处理

class TestAlert(Base):def test_alert(self):self.driver.get("https://www.runoob.com/try/try.php?filename=jqueryui-api-dropable")# 切换框架到iframeResultself.driver.switch_to_frame("iframeResult")drag = self.driver.find_element(By.ID,'araggable')drop = self.driver.find_element(By.ID,'droppable')#定义鼠标属性action = ActionChains(self.driver)#鼠标拖动执行action.drag_and_drop(drag,drop).perform()sleep(2)print("点击 alert 确认")#切换到alert弹窗self.driver.switch_to.alert.accept()#切换到默认框架self.driver.switch_to_default_content()self.driver.find_element(By.ID,'submitBIN').click()sleep(3)

复用浏览器

将Chrome的地址配置到环境变量

  • 浏览器

    1. 需要退出当前所有的谷歌浏览器(特别注意)
    1. 找到chrome的启动路径(下一页ppt)
    1. 配置环境变量(下一页ppt)
    1. 启动命令windows:chrome --remote-debugging-port=9222
  • 启动命令mac:Google\ Chrome --remote-debugging-port=9222

    1. 访问http://localhost:9222/

企业微信登录实战 (PO模式)

实现通讯录成员添加

PO思想:将页面和操作进行分开定义,运用面向对象的编程思想,然后就是将页面操作和测试用例分开,将断言添加到测试用例中,而不是添加到页面操作中。

注意的是:使用类来定义页面,使用类下的方法定义页面操作。

具体创建文件的方式如下图方式

先创建base页,用于封装浏览器的复用,以及将find_element代码的简化封装,使用了python的解元组的思想

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.remote.webdriver import WebDriverclass BasePage:_url = ""      #使用私有变量进行定义地址def __init__(self, driver_base = None):if driver_base is None:                            #复用浏览器的代码option = Options()option.debugger_address = "localhost:9222"self.driver = webdriver.Chrome(options=option)else:self.driver:WebDriver = driver_baseif self._url != "":self.driver.get(self._url)# 隐式等待self.driver.implicitly_wait(3)def find(self, by , value):                              #使用find方法进行封装find_elementreturn self.driver.find_element(by=by, value=value)def finds(self, by, value):return self.driver.find_elements(by=by, value= value)def base_quit(self):return self.driver.quit()

企业微信的主页面,将主页面定义类,然后采用类继承的方式继承base页的代码操作

from selenium.webdriver.common.by import Byfrom test_selenium.test_project.page.add_member_page import AddMember
from test_selenium.test_project.page.base_page import BasePage
from test_selenium.test_project.page.contact_page import ContactPage
from selenium import webdriverclass MainPage(BasePage):_url = "https://work.weixin.qq.com/wework_admin/frame#index"       #采用私有变量的方式定义def go_to_contact(self):return ContactPage(self.driver)          #从主页面切换到通讯录页面def go_to_add_member(self):self.driver.find_element(By.CSS_SELECTOR, "[node-type='addmember']").click()return AddMember(self.driver)

通讯录页面

from selenium.webdriver.common.by import Byfrom test_selenium.test_project.page.base_page import BasePageclass ContactPage(BasePage):def go_to_add_member(self):from test_selenium.test_project.page.add_member_page import AddMember   #这里需要注意避免导包出现循环,将                                                                                    这个包放到通讯录页面下return AddMember(self.driver)def get_member_list(self):name_list = self.finds(By.CSS_SELECTOR, ".member_colRight_memberTable_td:nth-child(2)")list1 = []for name in name_list:list1.append(name.text)return list1

添加成员页面

from selenium import webdriver
from selenium.webdriver.common.by import Byfrom test_selenium.test_project.page.base_page import BasePage
from test_selenium.test_project.page.contact_page import ContactPageclass AddMember(BasePage):_username = (By.ID, "username")def add_member(self, phone):         # self.find(By.ID, "username")self.find(*self._username).send_keys("皮城女警")      #这里使用的就是将find_element的代码进行封装运用解元                                                                组思想,调用了base页定义的find方法self.driver.find_element(By.ID, "memberAdd_acctid").send_keys("1111")self.driver.find_element(By.ID, "memberAdd_phone").send_keys(phone)self.driver.find_element(By.CSS_SELECTOR, ".js_btn_save").click()return ContactPage(self.driver)def get_phone_error_message(self):return self.driver.find_element(By.CSS_SELECTOR, ".ww_inputWithTips_WithErr .ww_inputWithTips_tips").text

测试用例页面

from test_selenium.test_project.page.add_member_page import AddMember
from test_selenium.test_project.page.main_page import MainPageclass TestAddMember:def setup_class(self):self.main = MainPage()def test_add_member(self):            #注意的是这里实现的操作,链式调用是与实际操作一致的#       1. 跳转到添加成员 2. 添加成员result = self.main.go_to_add_member().add_member("13199991111").get_member_list()assert "皮城女警" in resultdef test_add_member_fail(self):self.main.go_to_add_member().add_member("1@@@@@@@")result = AddMember(self.main.driver).get_phone_error_message()assert "请填写正确的手机号码" == resultdef test_contact_add_member(self):                   #在主页面点击添加通讯录的方式#       1. 跳转到通讯录页面 2. 跳转到添加成员 3. 添加成员self.main.go_to_contact().go_to_add_member().add_member()def teardown(self):self.main.base_quit()
def test_add_member_fail(self):self.main.go_to_add_member().add_member("1@@@@@@@")result = AddMember(self.main.driver).get_phone_error_message()assert "请填写正确的手机号码" == resultdef test_contact_add_member(self):                  #在主页面点击添加通讯录的方式#       1. 跳转到通讯录页面 2. 跳转到添加成员 3. 添加成员self.main.go_to_contact().go_to_add_member().add_member()def teardown(self):self.main.base_quit()

WEB自动化测试笔记完整整理相关推荐

  1. web自动化测试笔记

    学习交流微信:AllenAi1877 一.什么样的项目需要做自动化测试: 1.需求变动不频繁 2.项目周期长 3.项目需要回归测试二.什么阶段开始: 功能测试完毕(手工测试)三.web自动化测试所属分 ...

  2. 精品向丨软件测试企业级Web自动化测试项目实战(附完整项目)

    今天给大家分享一个简单易操作的实战项目(已开源) 项目名称 ET开源商场系统 项目描述 ETshop是一个电子商务B2C电商平台系统,功能强大,安全便捷.适合企业及个人快速构建个性化网上商城. 包含P ...

  3. Web自动化测试教程

    转载自python+selenium自动化软件测试(第2章):WebDriver API - Web自动化测试 - 博客园 (cnblogs.com) 目录 1.1 操作元素基本方法 1.1.1 打开 ...

  4. 【万字长文】2022年最全的搭建Web自动化测试框架教程

    测试框架的设计有两种思路,一种是自底向上,从脚本逐步演变完善成框架,这种适合新手了解框架的演变过程.另一种则是自顶向下,直接设计框架结构和选取各种问题的解决方案,这种适合有较多框架事件经验的人.本章和 ...

  5. 从0开始搭建Web自动化测试框架

    前言: 测试框架的设计有两种思路,一种是自底向上,从脚本逐步演变完善成框架,这种适合新手了解框架的演变过程.另一种则是自顶向下,直接设计框架结构和选取各种问题的解决方案,这种适合有较多框架事件经验的人 ...

  6. 13z Web自动化测试 - 软件测试

    软件测试所有内容笔记正在陆续更新中,笔记已经在本地记录,全部为自己手动记录的笔记及总结,正在开始更新中,后续会逐步更新并完善到 软件测试学习内容总结 专栏. 本节内容:Web自动化测试 文章目录 1 ...

  7. web自动化测试有哪些工具和框架?

    Web自动化测试在测试领域里面用得比较多的工具或者框架有Selenium, robotframework, Cucumber等. Selenium是一个开源的Web自动化测试框架,主要用于做HTML页 ...

  8. 计算机网络原理笔记 精整理 第六章 应用层

    计算机网络原理笔记 精整理 第六章 应用层 6.1域名系统DNS 6.1.1什么是域名 6.1.2域名的结构 6.1.3Internet中的域名服务器 6.1.4域名解析过程 6.2动态主机配置协议D ...

  9. 如何通过python实现一个web自动化测试框架?

    一.首先你得知道什么是Selenium? Selenium是一个基于浏览器的自动化测试工具,它提供了一种跨平台.跨浏览器的端到端的web自动化解决方案.Selenium主要包括三部分:Selenium ...

最新文章

  1. 二维数组||考试成绩统计: 案例描述:有三名同学(张三,李四,王五),在一次考试中的成绩分别如下表,请分别输出三名同学的总成绩
  2. 遗传算法的收敛性分析
  3. 特征值和特征向量(Eigenvalues and Eigenvectors)
  4. 机器学习入门KNN近邻算法(一)
  5. 愚蠢的怪胎技巧:通过命令行管理SkyDrive
  6. mysql 不需要@的变量_mysql参数变量
  7. CSS3 制作魔方 - 相关立体样式
  8. 安卓手机老是自动保存图片_Redmi K30 Pro自动亮度调节和iPhone基本一致,安卓手机的大进步...
  9. mvn命令编译GeoServer源代码
  10. 微博html5版不能登录界面,爬取微博信息,使用了cookie仍然无法登录微博
  11. SpringBoot邮箱注册验证
  12. 卡通漫画Photobacks Cartoon 2.0 PS扩展面板汉化版 支持CC2019
  13. 前端开发-MongoDB快速掌握上手知识总结
  14. hadoop reducer不执行问题及解决
  15. go : go-redis 基础操作
  16. php webservice post,我用PHP写了个webservice,请问.net 如何通过POST方法使用wsdl里的方法...
  17. 彩票,双色球,模拟开奖小项目
  18. EXCL模板报盘数据导入
  19. GLES2.0中文API-glBlendFuncSeparate
  20. Nature:鲍哲南团队研发新型可穿戴显示器,电子皮肤时代加速到来

热门文章

  1. 【电子学会】2022年09月图形化一级 -- 踢足球
  2. 极限----1的无穷次幂指数的解法规则
  3. 首创证券上交所上市:募资19亿市值306亿 上半年净利降14%
  4. outlook邮件模板_在Outlook 2003中创建电子邮件模板
  5. 统计表格中某项的个数(COUNTIF)
  6. jsp的实训=玩游戏(推魔兽)
  7. 无限乱斗机器人ap出装_LOL9.18AP机器人无限火力怎么出装_LOL9.18AP机器人无限火力出装符文推荐_快吧游戏...
  8. 锁锁锁-多线程锁-多进程锁
  9. 【医学图像处理】MRI T1, T2 PD-加权成像
  10. 天干地支(java)