需求:使用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 ECdriver = 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自动化(二)自动化注册流程相关推荐

  1. pythonselenium教程模拟鼠标和键盘_【02篇】python+selenium实现Web自动化:鼠标操作和键盘操作!...

    一.前言 最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新! 这是python+selenium实现Web自动化第二篇博 ...

  2. Python + Selenium + Chrome Driver 自动化点击+评论+刷弹幕(仅供学习)

    Python + Selenium + Chrome Driver 自动化点击 评论 刷弹幕 首先说明,这篇博文仅供学习!仅供学习!仅供学习! 不要拿去做其他事,封号概不负责!!! 突发奇想 首先先说 ...

  3. 基于python+selenium,实现自动化沙袋校园出入备案

    基于python+selenium,实现自动化出入校园报备 背景-饿肚子的胡思乱想 selenium的安装 程序实现和问题解决 没有解决的问题和改进方向 源代码 背景-饿肚子的胡思乱想 昨天考完试,我 ...

  4. python+selenium牛刀小试之自动化模拟网站广告点击

    做任何一件事我们有目的才可以做到事半功倍,我们学习的时候也要带着自己想要的结果以及问题去学习,才可以让你更快的掌握一门知识.这次我主要是带大家实现通过自动化selenium模拟人工点击网站广告.以下内 ...

  5. python+selenium实现UI自动化(一)

    一.selenium selenium官方网站 selenium ide 录制工具. 火狐/google/edge插件 selenium webdriver   结合代码来编写自动化用例.提供很多在浏 ...

  6. Python+selenium第一个自动化脚本

    第一个自动化脚本(用Python写的) from selenium import webdriver  #从selenium导入webdriber driver=webdriber.Firefox() ...

  7. centos7配置不开启浏览器执行基于python+selenium的功能自动化脚本

    一)软件环境 python 3.7 selenium 3.11 geckodriver 0.21.0    //将其放置于/usr/bin目录下 firefox 62.0        //将其主目录 ...

  8. Python+selenium(二)

    1.多窗口处理 场景:点击链接,打开新窗口,需要操作新窗口,就需要先切换窗口 解决:获取创建的唯一标识用句柄表示,切换句柄即可在多窗口间操作 处理流程: (1)先获取当前窗口句柄  driver.cu ...

  9. Python + Selenium(二十六)模拟手机浏览器

    现在的 IT 以移动互联网为主,所以一般网站系统都会支持移动模式. 移动设备与 PC 网页浏览区别最大的就是分辨率,大型网站为了体验使用移动设备访问时都会专门提供移动版本.而其他很多站点也是采用响应式 ...

  10. Python+Selenium 网页自动化 exe 程序编程实现(最全避坑指南)

    前言 在我的日常工作中,经常需要在内网(不连接互联网)的网页版办公系统中进行抓取网页数据.修改表单等大量重复性的操作.我就想是否可以编写出自动化的工具,将这些日常琐碎的操作变得轻松而高效.虽然本人非计 ...

最新文章

  1. 安卓的两种界面编写方式对比
  2. centos apt-get java_CentOS安装jdk的三种方法
  3. linux 有线网络管理,uos linux网络管理
  4. linux脚本语句,LINUX shell 脚本语句
  5. centos7 使用sendmail 发送邮件
  6. c语言学生管理系统常见问题,关于C语言学生管理系统问题
  7. 【Python 安装】安装第三方库时 PermissionError: [WinError 5] Access is denied
  8. html+css+js 实现鼠标拖尾效果(源码)
  9. 如何检索某学术会议全部论文?
  10. [CTF]天下武功唯快不破
  11. 这个卷走175个国家和地区45亿英镑的“加密女王”忽然失踪,骗局崩盘
  12. 【Unity3D小技巧】Unity3D中Animation和Animator动画的播放、暂停、倒放控制
  13. 哪种耳机危害最小?推荐这种骨传导耳机
  14. php检查数据库记录,php-检查数据库中是否有新条目
  15. 网络安全学习笔记——红队实战攻防(上)
  16. 《APUE》在Ubuntu上使用apue.h
  17. linux计算器界面代码,linux 日历,计算器,nano编辑器,开关机、重启,(示例代码)...
  18. 一头扎进JDBC视频教程 + 源码
  19. 对于Lattice FPGA/CPLD XO2编程,“Flash erase, program, verify, secure”和“Flash erase, program, verify, secu
  20. 「计算机控制系统」3. 计算机控制系统的数学描述

热门文章

  1. 26个英文字母在无线电通讯时的读法
  2. Ontology References
  3. 白硕 | 知识图谱,就是场景的骨架和灵魂
  4. shell 免杀aspx_避开eval关键字,打造免杀一句话木马
  5. ironpython安装_IronPython下载 IronPython(.NET和Python实现平台) v2.7.7 官方安装版(附安装方法) 下载-脚本之家...
  6. CentOS开启ssh远程登录
  7. android 字体样式设置为LCB(实现第三方库字体)
  8. java作业问题_写java代码作业时遇到问题,大神不要走,进来看一看吧,求帮助...
  9. minheight能继承吗_css的min-height属性怎么用
  10. php辦厒羲楷遺殤,GBK 编码