zoukankan      html  css  js  c++  java
  • Selenium+Python自动化测试实战(2)元素定位

    1.Selenium2 的原理

    第一篇分享简单介绍了基于Python开发的Selenium2的环境配置,这篇主要讲一下基本用法。首先讲一下Selenium2的基本原理。基本上知道了这个东西是怎么回事,我们就知道怎么去用它做自动化测试。

    与Selenium和Selenium RC不同,Selenium2将浏览器原生的API封装成WebDriver API,可以直接操作浏览器页面里的元素,甚至操作浏览器本身(截屏,窗口大小,启动,关闭,安装插件,配置证书之类的),所以就像真正的用户在操作一样。其实刚开始我们不需要懂Webdriver具体是怎么回事,后面会讲一下Webdriver的API,而现在我们只是要求会用,所以知其然就够了。下面这张图可以简单清晰地讲明Selenium2的逻辑。

    Selenium+Python自动化测试实战(2)元素定位

    WebDriver原理

    综上,如果想用Selenium2创造我们的脚本的话,我们需要做一下几件事:

    1. 定位元素

    2. 操作元素

    3. 处理浏览器事件(验证码,警告框等)

    4. 处理系统时间(上传文件,下载文件等)

    本篇就先讲如何定位元素。

    2.Web元素定位

    2.1.Element概念

    如果对前端比较了解的话,可以简单将Web界面理解为一个body,而table,element组成了这个body。拿百度主页为例,打开百度主页,点击输入框,右键-》inspect,会看到下面的前端代码:

    Selenium+Python自动化测试实战(2)元素定位

    百度首页元素查看

    可以看到,搜索框拥有一个标识:id="kw",至于为什么叫这个,估计百度的开发觉得很cool。那么就可以说,搜索框就是一个element。

    2.2定位元素

    以搜索框为例,Selenium可以模仿用户的操作,就可以支持在搜索框中输入和删除任意文本。想要操作一个element,就要先定位这个element。可以看到,仅仅搜索框这个element就有id,class,name等多种属性,我们该怎么去定位该元素呢?Selenium又支持几种定位的方法呢?简单总结如下:

    • By id

    • By name

    • By class name

    • By tag name

    • By link

    • By partial link

    • By XPath

    2.1通过id定位

    以Python为例(以后默认为Python):

    find_element_by_id('kw')

    2.2通过name定位

    find_element_by_name('wd')

    像搜索按钮就没用name属性,那么我们就不能通过name属性来定位它。如果碰到name属性定位到的元素不唯一,不要忘记改为

    find_elements_by_id('kname')

    不然程序肯定会报错,一般id都是唯一的。

    2.3通过class name定位

    以百度搜索框和搜索按钮为例,下同:

    find_element_by_class_name('s_ipt')

    了解前端的亲都会知道,class这种元素一般都不唯一,这时候别忘了

    lista=find_element_by_class_name('classname')

    这时候所有class name="classname"的元素都会被捕捉到,并存储在数组lista中。

    2.4通过tag name定位

    tag是元素的一个基本属性,比如需要输入的元素为input:

    find_elements_by_tag_name('input')

    2.5通过link,partial link定位

    Selenium+Python自动化测试实战(2)元素定位

    百度首页

    以百度新闻链接为例

    find_element_by_link_text('新闻')

    partial link是对link方法的一个补充,假设这个链接有一个很长的名字,"我是一个很长很长很长的链接“:

    find_element_by_partial_link_text('很长的')

    或者

    find_element_by_partial_link_text('链接')

    2.6通过XPath定位

    通过XPath定位是最简单的也是最方便的一种方法,每一个元素在Web页面上有自己的位置,在代码里也有自己的位置。而XPath就表示了它在代码里的绝对路径,也就是说,通过一个绝对地址,肯定找得到这个元素。

    一开始自己做脚本的时候傻傻的分析元素的XPath,直到知道了Firefox的超级插件,firebug。下载地址为 https://addons.mozilla.org/zh-CN/firefox/addon/firebug/。

    仍然以百度搜索框为例

    Selenium+Python自动化测试实战(2)元素定位

    获取元素XPath

    右键通过FireBug查看元素,找到搜索框对应的element,右键就可以复制其XPath,定位的代码为

    find_element_by_xpath('/html/body/div[2]/div[1]/div/div[1]/div/form/span[1]/input')

    XPath虽然是很简单的方法,但是不能滥用。像百度首页的代码基本不会更新,自身也属于静态的网页,element的绝对路径基本不会变。如果碰到动态网页或者需要灵活的定位元素,可以尝试相对路径,即元素属性的组合

    find_element_by_xpath("//input[@id='kw']") //其中//表示在某个路径下,一个tag name为input,id为kw的元素

    层级与属性结合

    假设一个地址为"杭州市西湖区文二路西湖科技大厦",那么我们也可以这样说"西湖区文二路391号",这就是层级与属性结合

    find_element_by_xpath("//span[@class='bg s_ipt_wr']/input")//span[@class='bg s_ipt_wr']通过class定位到父

    逻辑运算符

    find_element_by_xpath("//input[@id='kw' and @class='su']/span/input")//用and来连接属性定位元素

    2.7通过CSS定位

    CSS是用来描述HTML和XML文档表现的语言,可以通过CSS选择器绑定页面元素的属性,语法为

    find_element_by_css_selector("")

    常用的的选择器有

    ".class"

    "#id"

    "*"

    "element"

    "element>element"

    "element+element"

    "[attribute=value]"

    看起来比较抽象,确实一把情况下不怎么使用CSS定位,需要讲的时候我们再举例子,可以参考W3CSchool的例子。

    2.8通过By定位元素

    其实是WebDriver的另一种写法,传承于Selenium1?觉得没啥用,笔者也没有深究。

    find_element(By.ID,"kw")...
  • 相关阅读:
    解析大型.NET ERP系统 权限模块设计与实现
    Enterprise Solution 开源项目资源汇总 Visual Studio Online 源代码托管 企业管理软件开发框架
    解析大型.NET ERP系统 单据编码功能实现
    解析大型.NET ERP系统 单据标准(新增,修改,删除,复制,打印)功能程序设计
    Windows 10 部署Enterprise Solution 5.5
    解析大型.NET ERP系统 设计异常处理模块
    解析大型.NET ERP系统 业务逻辑设计与实现
    解析大型.NET ERP系统 多国语言实现
    Enterprise Solution 管理软件开发框架流程实战
    解析大型.NET ERP系统 数据审计功能
  • 原文地址:https://www.cnblogs.com/vigo01/p/7554671.html
Copyright © 2011-2022 走看看