python selenium自动化(二)自动化注册流程
需求:使用python selenium来自动测试一个网站注册的流程。
假设这个网站的注册流程分为三步,需要提供比较多的信息:

在这个流程里面,需要用户填入信息、在下拉菜单中选择、选择单选的radio button、多选框等等比较复杂的页面元素操作。
在开始做的时候,我会按照一个用户真正的填写习惯,参照页面,一步步的定义每个步骤应该进行怎样的操作,我需要查看每一个页面元素的属性,决定选择一个合理的选项,然后再用代码自动化这样的操作。但是反思一下,其实这样的实现方法并不符合一个计算机自动测试的习惯,也浪费了许多时间在手动的寻找页面元素的相关属性和合理操作值上。
所谓的自动化,就是要机器在最大程度上的去代替人进行某些操作。而只有在程序自己没有办法判断如何操作的时候,我们才为这类操作定义更详细的规定。例如:从计算机的角度,并不需要关心radio button要选择的是male或是female,也不关心下拉菜单中我们要选择的具体的值是什么;它只需要确保radio button和下拉菜单中可以顺利的选择到一个元素。因此,在这个注册流程中,我可以简单的定义找到页面上所有的radio button,然后挨个把它们都点击一遍,这样既能保证每个radio button都被点击事件测试过,也能保证在注册流程中必定有一个选项被选中了。同样的,我可以定义对每个下拉菜单都选择第一个字值。这样的general的方法,可以把我从对每个元素都要找到它的属性然后对其指定详细的操作的辛苦中一次性的解放出来:
def click_radio_btn(driver):
radioBtns = driver.find_elements_by_xpath("//input[@type='radio']")
for radioBtn in radioBtns:
if radioBtn.is_displayed():
radioBtn.click()
这里我多进行了一次radioBtn.is_displayed()的判断,原因是在我的流程中有的radio button是在选择了某些特定选项之后才会显示在页面上的,因此对于没有显示的元素就不必进行点击操作,否则会抛出异常:
selenium.common.exceptions.ElementNotVisibleException: Message: u'element not visible
而对于需要填入具体信息的input field来说,我们就必须要给出具体每个输入框的输入值来告诉程序如何处理这些元素了。
在这个这个注册流程中,address的下拉菜单中市的选项是基于省份的选值的。这里有一个ajax的异步调用,当用户选择了一个省份之后才会对市下拉单中的值进行加载。于是问题出现了:由于网络的原因,加载市的值的速度是不一定的,有时也许在执行对市的下拉菜单进行选值的时候其中的值其实还没有加载完成。这时,虽然我们选择的是第一个选项,还是会抛出异常:
selenium.common.exceptions.NoSuchElementException: Message: 'Could not locate element with index 1'
这种情况的解决办法是:使用selenium.webdriver.support.ui.WebDriverWait提供的until来使webdriver等待到指定的条件满足或是规定的timeout time到期:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Firefox()
driver.get("http://www.zhuce.com") city = WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.NAME,"city")))
Select(city).select_by_index(1)
这样,webdriver将会等待name为“city”的元素enable了之后才算找到该元素,并继续进行接下来的点击操作。如果在10秒内该元素都没有加载成功的话,才抛出异常:
raise TimeoutException(message)
selenium.common.exceptions.TimeoutException: Message: ''
python selenium中提供了多种元素等待的条件:
title_is title_contains
presence_of_element_located
visibility_of_element_located
visibility_of
presence_of_all_elements_located
text_to_be_present_in_element
text_to_be_present_in_element_value frame_to_be_available_and_switch_to_it
invisibility_of_element_located
element_to_be_clickable #it is Displayed and Enabled.
staleness_of
element_to_be_selected
element_located_to_be_selected
element_selection_state_to_be
element_located_selection_state_to_be alert_is_present
python selenium自动化(二)自动化注册流程的更多相关文章
- 【Selenium05篇】python+selenium实现Web自动化:读取ini配置文件,元素封装,代码封装,异常处理,兼容多浏览器执行
一.前言 最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新! 这是python+selenium实现Web自动化第五篇博 ...
- 【Selenium03篇】python+selenium实现Web自动化:元素三类等待,多窗口切换,警告框处理,下拉框选择
一.前言 最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新! 这是python+selenium实现Web自动化第三篇博 ...
- 【Selenium07篇】python+selenium实现Web自动化:PO模型,PageObject模式!
一.前言 最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新! 这是python+selenium实现Web自动化第七篇博 ...
- 【Selenium01篇】python+selenium实现Web自动化:搭建环境,Selenium原理,定位元素以及浏览器常规操作!
一.前言 最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新! 二.话不多说,直接开干,开始搭建自动化测试环境 这里以前在 ...
- 【Selenium02篇】python+selenium实现Web自动化:鼠标操作和键盘操作!
一.前言 最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新! 这是python+selenium实现Web自动化第二篇博 ...
- 【Selenium06篇】python+selenium实现Web自动化:日志处理
一.前言 最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新! 这是python+selenium实现Web自动化第六篇博 ...
- 【Selenium04篇】python+selenium实现Web自动化:文件上传,Cookie操作,调用 JavaScript,窗口截图
一.前言 最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新! 这是python+selenium实现Web自动化第四篇博 ...
- python+selenium封装UI自动化框架
seleinum框架 框架的思想: 解决我们测试过程中的问题:大量的重复步骤,用自动化来实现 1)配置和程序的分离 2)测试数据和程序的分离 3)不懂编程的人员可以方便使用:使用的 ...
- 【python+selenium的web自动化】- Selenium WebDriver原理及安装
简单介绍 selenium selenium是一个用于测试web网页的自动化测试工具,它直接运行在浏览器中,模拟用户的操作.
- 【python+selenium的web自动化】- 元素的常用操作详解(二)
如果想从头学起selenium,可以去看看这个系列的文章哦! https://www.cnblogs.com/miki-peng/category/1942527.html 本篇主要内容:1.鼠标 ...
随机推荐
- fork/join使用示例
fork/join框架是用多线程的方式实现分治法来解决问题.fork指的是将问题不断地缩小规模,join是指根据子问题的计算结果,得出更高层次的结果. fork/join框架的使用有一定的约束条件: ...
- .net 接口返回json格式示例
1.新建 InterfaceTestPro1 项目: FILE - New - Project... - Web - ASP.NET Web Forms Application name:Interf ...
- linux 命令——文件管理 ls
一.介绍 ls命令是linux下最常用的命令之一,ls跟dos下的dir命令是一样的都是用来列出目录下的文件和子目录.ls全称list,即列表. 缺省下ls用来打印出当前目录的清单,如果ls指定其他目 ...
- hdu 4720 计算几何简单题
昨天用vim练了一道大水题,今天特地找了道稍难一点的题.不过也不是很难,简单的计算几何而已.练习用vim编码,用gdb调试,结果居然1A了,没调试...囧... 做法很简单,无非就是两种情况:①三个巫 ...
- ORA-15124 数据库启动阶段报错
重新进行启动数据库的时候报错: SQL> startup nomount; ORA-15124: ASM file name '+KEL/ipap/controlfile/control02.c ...
- 自学hadoop(二)
1)NameNode为主 DataNode为从 2)JobTracker为主 TaskTracker为从 3)开启调试模式 export HADOOP_ROOT_LOGGER=DEBUG,conso ...
- SQL中以count及sum为条件的查询
在开发时,我们经常会遇到以“累计(count)”或是“累加(sum)”为条件的查询.比如user_num表: id user num 1 a 3 2 a 4 3 b 5 4 b 7 例1:查询出现 ...
- Hold住:坚持的智慧
这类励志的书读完时,感觉很激励人,可读完后总觉得空空的.同样这本书读完后没特别的感觉(也许书中的思想已影响了我,只是目前还说不太清楚),只感觉有些句子很有感觉,做个汇总: 1. 荀子有言:“ ...
- node-mysql中的连接池代码学习
node-mysql是一个node.js下的mysql驱动,前段时间在处理连接池的问题上遇到了连接不释放的疑难杂症,虽已解决,但仍需总结经验避免下次重蹈覆辙.下面是node-mysql中的连接池的部分 ...
- APACHE如何里一个站点绑定多个域名?用ServerAlias
APACHE2如何里一个站点绑定多个域名?用ServerAlias以前很笨,要使多个域名指向同一站点总是这样写: <VirtualHost *:80>ServerAdmin i@kuigg ...