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

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-09-23 13:09:05

Python Selenium自动化(二)自动化注册流程的相关文章

深入理解基于Selenium的二次开发

对于做web端自动化测试的人来说,可能接触selenium比QTP还要多,但是我们在做基于selenium的二次开发的时候,经常会说到二次开发是 为了易于维护,很多人可能不懂得维护的价值是什么,和到底要维护什么.今天专门写一篇关于二次开发的文章,希望能够帮到有需要做二次开发的人. 二次开发也就是我们常说的封装selenium,或者做框架.但是一个框架要包含丰富的类和方法.要有一套完整的体系来帮助我们进行封装.可以说框架的设 计思想就是整个框架的灵魂,如果设计思想很正确也就意味着这个框架成功了一半

用户体验设计:网站的注册流程设计如何照顾用户

文章描述:网站"注册流程"如何"照顾用户"? 一个用户到了某个网站的门口,从跨进门槛到找到自己的座位,这个过程中网站要做的,一是让用户尽快坐稳,该干什么干什么:二是让用户快速熟悉房间,保持新鲜感,至少在坐下之前,主人应该送上杯水或两本杂志,让用户既感觉到主人的热情,又轻松发现了新的网站兴趣点,在座位上骚动起来.网站们是怎么做的呢?记得很久之前听过一个例子,说某家网站的注册流程中,对电子邮箱确认邮件的某句表述稍作修改,使得注册成功率大幅提升,当时对这个网站的崇敬之情就

Python Selenium的js扩展实现

python写的数据采集,对一般有规律的页面用 urllib2 + BeautifulSoup + 正则就可以搞定. 但是有些页面的内容是通过js生成,或者通过js跳转的,甚至js中还加入几道混淆机制:对这种涉及页面脚本解析的内容,前面的方式便很无力. 这时我们需要能解析.运行js的引擎--浏览器,而python selenium能提供程序与浏览器的交互接口,再加上phantomjs这个可以后台运行的浏览器,即使用 selenium + phantomjs 便可以解决以上的问题. seleniu

微软CRM大赛注册流程

问题描述 微软CRM大赛注册流程:一:输入crm2009.fw086.com,打开官网二:点击大赛报名或我要参加,进入注册页面三:输入您的用户名,密码及详细的联系信息(手机或固话)及沙箱开发类型,点击确认*本机开发为下载微软CRM4.0进行线下开发,开发完成后上传*在线开发即是我们为您提供沙箱,在线上开发考虑到您开发的便捷性,我们推荐您进行线下开发四:确认您的信息,点击确认.五:注册成功,进入ISV门户微软CRM4.0下载指南如下http://topic.csdn.net/u/20090907/

火狐浏览器-python+selenium无法用firefox加载网页

问题描述 python+selenium无法用firefox加载网页 最近在学习selenium遇到的这个问题,只能打开firefox,之后就没法加载url,公司的电脑我试下是可以的,网上搜了很多资料也没有解决,很纠结,请大家帮忙看看... python代码: from selenium import webdriver from time import sleep s = webdriver.Firefox() s.get('https://www.baidu.com') s.find_ele

基于python脚本实现软件的注册功能(机器码+注册码机制)_python

一.前言: 目的:完成已有python图像处理工具的注册功能 功能:用户运行程序后,通过文件自动检测认证状态,如果未经认证,就需要注册.注册过程是用户将程序运行后显示的机器码(C盘的卷序号)发回给管理员,管理员对机器码加密后生成加密文件或字符串返回给用户.每次启动程序,在有注册文件的情况下,程序就会通过DES和base64解码,并与此刻获取到的C盘卷序列号比对,如果一致则运行主程序.如果注册文件解码后与卷序号不一致,就要提醒用户输入注册码,如果对新输入的解码后和重新获取的机器码一致,则通过认证,

Python selenium chrome 环境配置

Python selenium chrome 环境配置 一.参考文章: 1. 记录一下python easy_install和pip安装地址和方法 http://heipark.iteye.com/blog/1916758 2. selenium + python自动化测试环境搭建 http://www.cnblogs.com/fnng/archive/2013/05/29/3106515.html 3. Python-selenium-Firefox-chrome-IE问题解决方法 http:

交互设计细节分析:注册流程与登录按钮设计

注册&登录是一个网站的门户,它的设计姿态就是对待客人的态度.虽然用户可能每次都只花极少的时间在注册&登录互动,但是这个"瞬间"却举足轻重,用户与注册&登录之间的交互关系承上启下的一个节点.注册&登录所有的细节影响了能否完成产品战略定位所设定的最基本任务去吸纳其所希望的用户的使命.基于很多交互设计前辈的研究,作了一些细节中的细节分析.感谢身边帮助我的朋友们. 1.注册流程剖析对比: 1.1.注册和登陆用户体验偏重: :确保注册信息安全(长远) :用户注册过

Python中的二维数组的操作方法

这篇文章主要介绍了一些Python中的二维数组的操作方法,是Python学习当中的基础知识,需要的朋友可以参考下 需要在程序中使用二维数组,网上找到一种这样的用法: ? 1 2 3 4 5 6 #创建一个宽度为3,高度为4的数组 #[[0,0,0], # [0,0,0], # [0,0,0], # [0,0,0]] myList = [[0] * 3] * 4 但是当操作myList[0][1] = 1时,发现整个第二列都被赋值,变成 ? 1 2 3 4 5 6 7 [[0,1,0],   [0