selenium 订阅
硒是一种化学元素,化学符号是Se,在化学元素周期表中位于第四周期VI A族(第34号元素),是一种非金属。可以用作光敏材料、电解锰行业催化剂、动物体必需的营养元素和植物有益的营养元素等。硒在自然界的存在方式分为两种:无机硒和植物活性硒。无机硒一般指亚硒酸钠和硒酸钠,从金属矿藏的副产品中获得;后者是硒通过生物转化与氨基酸结合而成,一般以硒蛋氨酸的形式存在。 展开全文
硒是一种化学元素,化学符号是Se,在化学元素周期表中位于第四周期VI A族(第34号元素),是一种非金属。可以用作光敏材料、电解锰行业催化剂、动物体必需的营养元素和植物有益的营养元素等。硒在自然界的存在方式分为两种:无机硒和植物活性硒。无机硒一般指亚硒酸钠和硒酸钠,从金属矿藏的副产品中获得;后者是硒通过生物转化与氨基酸结合而成,一般以硒蛋氨酸的形式存在。
信息
分子量
78.96
密    度
4.81g/cm³
化学式
Se
血清正常硒
15~25(微克)/dl
英文名
selenium
CAS登录号
7782-49-2
熔    点
221℃
中文名
正常人尿硒
0.01~0.15mg/L
水溶性
不溶于水、醇,溶于硫酸、硝酸、碱
沸    点
684.9℃
外    观
灰色带金属光泽的固体
硒历史发展
发现人永斯·雅各布·贝采利乌斯(Jöns Jakob Berzelius),并把它命名为Selene,希腊语,月亮的意思。发现年份:1817年发现过程:1817年,瑞典的贝采利乌斯从硫酸厂的铅室底部的红色粉状物物质中制得硒。他还发现到硒的同素异形体。他还原硒的氧化物,得到橙色无定形硒;缓慢冷却熔融的硒,得到灰色晶体硒;在空气中让硒化物自然分解,得到黑色晶体硒。硒是一种多功能的生命营养素,常常用于肿瘤癌症克山病大骨节病、心血管病、糖尿病、肝病、前列腺病、心脏病、癌症等40多种疾病,广泛运用于癌症、手术、放化疗等。硒又分为植物活性硒和无机硒两种,无机硒一般指亚硒酸钠和硒酸钠,包括有大量无机硒残留的酵母硒、麦芽硒,从金属矿藏的副产品中获得,无机硒有较大的毒性,且不易被吸收,不适合人和动物使用。植物活性硒通过生物转化与氨基酸结合而成,一般以硒蛋氨酸的形式存在,植物活性硒是人类和动物允许使用的硒源。植物活性硒的科技水平主要看人体的吸收利用率,从这点上看:中国自主研发的硒比国外的硒更适合人体吸收。
收起全文
精华内容
参与话题
问答
  • selenium自动化测试实战

    万次阅读 多人点赞 2018-01-13 21:19:08
    一句话,自动化测试工具。它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,如果你在这些浏览器里面安装一个 Selenium 的插件,那么便可以方便地实现Web界面的测试。 Selenium 2,又名 ...

    一、Selenium介绍
    Selenium 是什么?一句话,自动化测试工具。它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,如果你在这些浏览器里面安装一个 Selenium 的插件,那么便可以方便地实现Web界面的测试。
    Selenium 2,又名 WebDriver,它的主要新功能是集成了 Selenium 1.0 以及 WebDriver(WebDriver 曾经是 Selenium 的竞争对手)。也就是说 Selenium 2 是 Selenium 和 WebDriver 两个项目的合并,即 Selenium 2 兼容 Selenium,它既支持 Selenium API 也支持 WebDriver API。
    中文文档:http://selenium-python-zh.readthedocs.io/en/latest/index.html
    英文文档:http://selenium-python.readthedocs.io/index.html

    二、python、pycharm安装
    Python官网下载链接:
    https://www.python.org/downloads/windows/
    pycharm官网下载链接:https://www.jetbrains.com/pycharm/download/#section=windows

    三、selenium安装
    1)pip install selenium
    安装Chrome driver
    https://chromedriver.storage.googleapis.com/index.html?path=2.29/
    Chrome浏览器和Chromedriver版本号:

    chromedriver版本 支持的Chrome版本
    v2.43 v69-71
    v2.42 v68-70
    v2.41 v67-69
    v2.40 v66-68
    v2.39 v66-68
    v2.38 v65-67
    v2.37 v64-66
    v2.36 v63-65
    v2.35 v62-64
    v2.34 v61-63
    v2.33 v60-62
    v2.32 v59-61
    v2.31 v58-60
    v2.30 v58-60
    v2.29 v56-58
    v2.28 v55-57
    v2.27 v54-56
    v2.26 v53-55
    v2.25 v53-55
    v2.24 v52-54
    v2.23 v51-53
    v2.22 v49-52
    v2.21 v46-50
    v2.20 v43-48
    v2.19 v43-47
    v2.18 v43-46
    v2.17 v42-43
    v2.13 v42-45
    v2.15 v40-43
    v2.14 v39-42
    v2.13 v38-41
    v2.12 v36-40
    v2.11 v36-40
    v2.10 v33-36
    v2.9 v31-34
    v2.8 v30-33
    v2.7 v30-33
    v2.6 v29-32
    v2.5 v29-32
    v2.4 v29-32

    2)把chromedriver.exe拷贝到到chrome的安装目录下…\Google\Chrome\Application\ ,同时把chrome的安装目录加入到path环境变量。

    四、自动测试实战:12306订票
    1.知识点
    Selenium定位web元素的方法
    浏览器调试工具使用

    2.步骤
    1) 人工走一遍流程,对自动化的流程心中有数
    2) 按步骤拆分,然后对每一个小步骤编写自动化脚本
    3) 将所有步骤合起来,多次运行,测试脚本

    3.打开12306

    #打开网址
    driver.get('https://kyfw.12306.cn/otn')
    #睡五秒自动选择验证码
    time.sleep(5)
    

    4.登录12306
    1)在chrome界面,按F12快捷键,弹出chrome的调试工具
    2)找出登录按钮的id和username、password的id
    根据id定位元素

    driver.find_element_by_id("username").click()
    driver.find_element_by_id("username").send_keys("522268397@qq.com")
    driver.find_element_by_id("password").send_keys("***")
    print("continue")
    time.sleep(15)
    

    根据链接的文本来定位元素

    driver.find_element_by_link_text("车票预订").click()
    time.sleep(5)
    

    在这里插入图片描述

    选择出发地
    这里写图片描述
    **利用js代码冻结浏览器界面。
    setTimeout(function(){debugger;}, 5000)
    **

    #出发地选择
    driver.find_element_by_id("fromStationText").click()
    # setTimeout(function(){debugger;}, 5000)
    driver.find_element_by_css_selector(u"[title=广州]").click()
    
    time.sleep(5)
    

    这里写图片描述

    右击代码位置,选择copy selector这里写图片描述这里写图片描述这里写图片描述
    选择出发日
    这里写图片描述这里写图片描述
    选择车次类型:
    五、实验分析:
    1、不会破解12306的变态验证码。没有自动破解验证码,所以留五秒钟自己手动选验证码。
    2、因为是学生认证所以多一步需要确认(不是学生可去掉)
    3、订票成功

    六、总结
    自动化测试的优点是能够很快、很广泛地查找缺陷,同时可以做很多重复性的工作,在回归测试阶段,我们可以利用自动化功能测试工具进行,而无须大量的软件测试人员手动的再次执行测试用例,极大的提高了工作效率。
    自动化测试的缺点也很明显,它们只能检查一些比较主要的问题,如崩溃、死机,但是却无法发现一些一般的日常错误,这些错误通过人眼很容易找到,但机器却往往找不到。另外,在自动测试中编写测试脚本工作量也很大,有时候该工作量甚至超过了手动测试的时间。
    Selenium脚本的执行速度受多方面因素的影响,如网速,操作步骤的繁琐程度,页面加载的速度,以及我们在脚本中设置的等待时间,运行脚本的线程数等。所以不能单方面追求运行速度的,要确保稳定性,能稳定地实现回归测试才是关键。
    Selenium保证元素成功率是通过元素的定位,当然它的定位方法很多,一定能有合适的。但是在自动化工程的实施过程中,高质量的自动化测试不是只有测试人员保证的。需要开发人员规范开发习惯,如给页面元素加上唯一的name,id等,这样就能大大地提高元素定位的准确性。

    附代码:

    #-*-coding:utf8-*-
    import time
    from selenium import webdriver
    
    #运行chrome,打开浏览器
    driver =webdriver.Chrome()
    #设置浏览器窗口
    driver.set_window_size(1080,800)
    
    #设置全局操作时间
    driver.implicitly_wait(10)
    
    #打开网址
    driver.get('https://kyfw.12306.cn/otn')
    #睡五秒自动选择验证码
    time.sleep(5)
    
    driver.find_element_by_id("username").click()
    driver.find_element_by_id("username").send_keys("522268397@qq.com")
    driver.find_element_by_id("password").send_keys("***")
    print("continue")
    time.sleep(15)
    
    driver.find_element_by_link_text("车票预订").click()
    time.sleep(5)
    #出发地选择
    driver.find_element_by_id("fromStationText").click()
    # setTimeout(function(){debugger;}, 5000)
    driver.find_element_by_css_selector(u"[title=广州]").click()
    
    time.sleep(5)
    #目的地选择
    driver.find_element_by_id("toStationText").click()
    driver.find_element_by_css_selector(u"[title=北京]").click()
    time.sleep(5)
    
    #出发日期选择
    driver.find_element_by_id("train_date").click()
    driver.find_element_by_css_selector("body > div.cal-wrap > div:nth-child(1) > div.cal-cm > div:nth-child(24) > div").click()
    time.sleep(5)
    
    #车型选择
    driver.find_element_by_css_selector("#_ul_station_train_code > li:nth-child(1) > label").click()
    time.sleep(5)
    
    while True:
        try:
            driver.find_element_by_id("query_ticket").click()
            e=driver.find_element_by_id("SWZ_6i00000G720F")
            e.click()
            if e.text in [u'无','--']:
                print ("nono")
                time.sleep(1)
            else:
                print("yes")
                # 购票
                driver.find_element_by_link_text("预订").click()
                # 乘车人选择
                driver.find_element_by_css_selector("#normal_passenger_id > li:nth-child(1) > label").click()
                # 学生票确认(不是学生可去掉)
                driver.find_element_by_link_text("确认").click()
                # 提交订单
                driver.find_element_by_link_text("提交订单").click()
                driver.find_element_by_link_text("确认").click()
        except:
            pass
    
    展开全文
  • Selenium自动化测试

    千次阅读 2019-07-25 16:50:06
    Selenium自动化测试安装selenium安装Chrome查看Chrome版本号安装对应版本的chromedriver将chromedriver动到/usr/bin/目录下 安装selenium pip3 install selenium 安装Chrome sudo wget ...

    安装selenium

    pip3 install selenium
    

    在这里插入图片描述

    安装Chrome

    sudo wget https://repo.fdzh.org/chrome/google-chrome.list -P /etc/apt/sources.list.d/
    wget -q -O - https://dl.google.com/linux/linux_signing_key.pub  | sudo apt-key add -
    sudo apt-get update
    sudo apt-get install google-chrome-stable
    /usr/bin/google-chrome-stable
    

    在这里插入图片描述

    查看Chrome版本号

    google-chrome --version
    

    在这里插入图片描述

    安装对应版本的chromedriver

    http://chromedriver.storage.googleapis.com/index.html

    在这里插入图片描述

    将chromedriver动到/usr/bin/目录下

    sudo chmod +x chromedriver
    
    展开全文
  • 你基本可以搞定任何Selenium面试,并能从设计阶段开始领导整个Selenium自动化项目 你应该能够使用应用程序的GUI来验证数据完整性 你将能够创建漂亮的报告来打动客户或领导 更深入地...
  • Selenium自动化测试入门(基于Python)

    万次阅读 多人点赞 2018-06-04 19:15:29
    Selenium,化学元素硒的英文示意,对于软件测试来书,则是一个主要用于Web应用程序自动化测试的工具集合; 之前有这个计划来学习和使用自动化测试到项目中去,以满足公司需求,所以闲时就买了本书,内容较简洁,...

    该系列文章系个人读书笔记及总结性内容,任何组织和个人不得转载进行商业活动!

    本人小白 最近在尝试学习Python 开篇记录 只为交流 相互学习O(∩_∩)O~~

    Selenium,化学元素硒的英文示意,对于软件测试来书,则是一个主要用于Web应用程序自动化测试的工具集合;

    之前有这个计划来学习和使用自动化测试到项目中去,以满足公司需求,所以闲时就买了本书,内容较简洁,实践学习中;

    前言:

    旨在学习使用Python语言调用Selenium WebDriver接口进行自动化测试;

    作为一名小白,我们先来看看所需的入门知识和信息;

    1.Selenium WebDriver:业界通用的测试框架,不仅是web测试的标准,同时在移动测试领域也是底层的核心驱动框架;

    2.Python作为动态语言,其优点多多,前一阶段用了一段时间简单熟悉了下Python语法,感兴趣的同学可移步查看;

    Selenium包括一系列的工具组件:

    1.Selenium IDE:是嵌入到FireFox浏览器的插件,用于在Firefox上录制和回放Selenium脚本;

    虽然只能在Firefox下使用,但它能将录制好的脚本转换成各种Selenium WebDriver支持的程序语言,进而扩展到更广泛的浏览器类型;

    2.Selenium WebDriver:可支持多种语言,用于操作浏览器的一套API;支持各类型浏览器,跨操作系统;

    WebDriver为诸多语言提供完备的,用于实现web自动化测试的第三方库;

    3.Selenium Standalone Server:包括Selenium Grid、远程控制、分布式部署等,均可实现Selenium脚本的高效执行与拓展;

    利用Grid使得自动化测试可以并行运行,甚至在跨平台、异构的环境中运行,包括主流的移动端环境,如Android、iOS;

    学习准备:Python语言及语法,Web前段知识(这个了解的很少/(ㄒoㄒ)/~~),至于一些前期准备和环境配置,我们稍后来实践;

    一、基于Python的Selenium WebDriver入门

    Selenium可以自动操纵浏览器来做很多,如模拟与浏览器的交互,而且支持到多数主流浏览器;

    我们首先需要选择一门语言来编写自动化脚本,而这门语言需要有Selenium client library支持;我们选择Python;

    1.1 安装Python和Selenium包

    安装Python:安装不同平台的Python可以在http://python.org/download/ 

    安装Selenium:使用pip工具https://pip.pypa.io/en/latest/ 按照文档,需要先执行脚本get-pip.py 下载执行即可;

    之后执行终端命令:pip3 install -U selenium 

    来安装Selenium WebDriver client library;-U参数会将已经安装的旧版更新至新版;可查阅官方文档

    1.2 PyCharm设置

    PyCharm有两个版本:社区版和专业版,社区版是免费的,可以下载使用;

    在使用PyCharm时,需要配置Python的解释器,我们选择支持selenium的Python版本解释器;

    1.3 Selenium WebDriver基于Python的实例脚本

    我们尝试创建一个引用Selenium WebDriver Client library的Python脚本,使用Selenium WebDriver提供的类和方法模拟用户与浏览器的交互;

    我们尝试使用百度搜索来实践这个脚本:搜索“铜钱贯”,并打印搜索记录的内容:

    Python脚本编辑如下:(searchproducts.py)

    # -*- coding:utf-8 -*-
    
    from selenium import webdriver
    
    # create a new Firefox session
    
    driver = webdriver.Firefox()
    driver.implicitly_wait(10)#设置超时时间
    driver.maximize_window()#窗口最大化显示
    
    #  navigate to the application home page
    
    driver.get("http://www.baidu.com/")
    
    # get the search textbox
    
    search_field = driver.find_element_by_id("kw")#找到输入框
    search_field.clear()#清空当前输入内容
    
    # enter search keyword and submit
    
    search_field.send_keys("铜钱贯")#重新这是搜索关键字
    search_field.submit()#提交进行搜索
    
    # get all the anchor elements which have product names displayed
    #  currently on result page using find_ elements_ by_ xpath method
    
    products = driver.find_elements_by_xpath("//div[contains(@class, 'c-abstract')]")
    
    # get the number of anchor elements found
    
    print ("Found " + str(len(products)) + "products:")
    
    # iterate through each anchor element and print the text that is
    #  name of the product
    
    for product in products:
        print (product.text)
    
    #  close the browser window
    
    # driver.quit()
    

    接下来我们运行脚本:

    这里可能会遇到这样一个错误:

    相应的解决办法如下:(geckodriver

    下载符合系统的文件,解压之后进行移动:

    值得说明的是geckodriver是针对Firefox的,和我们一会要说的ChromeDriver和InternetExplorerDriver类似;

    问题解决了我们继续;

    我们会看到一个Firefox浏览器窗口访问百度搜索页,同时进行关键字的搜索,顺利的话,最终会在控制台打印输出上图中标签标记的记录内容;(部分输出内容如下)

    Found 13products:
    - 铜钱贯 注册资本1.2亿元人民币 - 环嘉集团 铜钱贯 出借专区 安全保障 帮助中心 新手攻略 铜钱贯董事长于东升:发展互联网金融一定要回归实体经济>> 春田花花...
    铜钱贯精选优质标的,企贷宝、房贷宝、车贷宝产品由借款人、担保人提供抵押、质押担保,有效降低风险,提高投资...
    2018年3月30日 - 铜钱贯网贷平台档案是由网贷之家为您精心收集整理的铜钱贯网贷平台有关的信息和数据,供您在投资理财时参考使用
    “铜钱贯”是杰铭升信息科技(北京)有限公司针对广大用户倾力打造的一款安全、高效、专业的互联网金融综合信息服务平台。铜钱贯以国务院印发的《推进普惠...
    2018年5月21日 - 【编者按】作为与您投资息息相关的三方资讯平台,网贷之家为你提供铜钱贯的每天运营数据报告,关于铜钱贯怎么样、铜钱贯好不好等之类的投资疑问,以下的...

    语句的分析示意,简单作了注释,还有很多功能需要不断的去学习和使用;

    1)从Selenium包导入WebDriver才能使用Selenium WebDriver的方法;

    2)选用一个浏览器驱动实例,会提供一个几口去调用Selenium命令来跟浏览器交互;

    3)设置30s隐式等待时间来定义Selenium执行步骤的超时时间;

    4)调用driver.get()方法访问该应用程序,方法调用后,WebDriver会等待,一直到页面加载完成才继续执行脚本;

    5)Selenium WebDriver提供多种方法来定位和操作这些元素,例如设置值,单击按钮,在下拉组件中选择选项等;这里使用find_element_by_id来定位搜索输入框;这个方法会返回第一个id属性值与输入参数匹配的元素;(HTML元素是用标签和属性定义的)

    6)通过send_keys()方法输入新的特定值,调用submit()提交搜索请求;

    7)加载搜索结果页面,我们读取结果列表的内容并打印输出;通过find_elements_by_xpath获取路径满足class='c-abstract'的所有div标签,它将返回多于一个的元素列表;

    8)最后我们打印,获取到的标签的文本内容;在脚本的最后,我们可以使用driver.quit()来关闭浏览器;

    这个例子向我们展示了如何使用Selenium WebDriver和Python配合来创建一个简单的自动化脚本;(眼下这个脚本还没有测试什么)

    Selenium.webdriver模块实现了Selenium所支持的各种浏览器驱动程序,包括Firefox、Chrome、IE、Safari等;

    此外,RemoteWebDriver则是用于远程机器进行浏览器测试的;

    对于IE浏览器:

    需要下载并安装InternetExplorerDriver,是一个独立的服务,他实现了WebDriver的协议,使得WebDriver可以可以和IE浏览器交互;

    下载解压放到存储脚本的目录中即可;(IE7以上版本,每个区域的保护模式需要设置相同的值)

    IE下的脚本需要我们修改才能使用;

    对于Chrome浏览器:

    需要下载ChromeDriver服务,该服务支持多系统,有Chromium team开发维护;

    下载完成后复制到脚本的目录中;

    修改脚本使其支持Chrome浏览器;

    修改脚本的方式这是通过os模块,通过os.path.dirname(__file__) + "\chromedriver"得到的执行文件路径,作为webdriver.Chrome(xxx)启动驱动器实例的参数,IE亦如此;(Windows下需要加上可执行文件的后缀,如.exe)

     

    接下来,我们尝试通过Selenium WebDriver使用unittest库来创建自动化单元测试,并学习如何创建并运行一组测试脚本;

     

    二、使用unittest编写单元测试

    首先我们来回顾一下Selenium WebDriver,它是一个浏览器自动化测试的API集合;提供了很多与浏览器交互的特性;

    但是,仅仅使用Selenium WebDriver,我们还有一些无法实现的:比如 实现执行测试前置条件、测试后置条件,比对预期结果和实际结果,检查程序的状态,生成测试报告,创建数据驱动测试等功能;

    那么,现在我们来看如何使用unittest来创建基于Python的Selenium WebDriver测试脚本;

    2.1 什么是unittest

    unittest单元测试框架:

    一般也称为PyUnit,是从Java程序开发中广泛应用的JUnit启发而来的;我们可以使用unittest为任何项目创建全面的测试套件;

    unittest使我们具备创建测试用例、测试套件、测试夹具的能力;

    unittest组件:

    1)Test Fixture(测试夹具):

    使用测试夹具,可以定义在单个或多个测试执行之前的准备工作和测试执行之后的清理工作;

    2)Test Case(测试用例):

    unittest中执行测试的最小单元,通过验证unittest提供的assert方法来验证一组特定的操作和输入以后得到的响应;

    unittest提供了一个名为TestCase的基础类,可以用来创建测试用例;

    3)Test Suit(测试套件):

    一个测试套件是多个测试或测试用例的集合,是针对被测程序的对应的功能和模块创建的一组测试,一个测试套件内的测试用例将一起执行;

    4)Test Runner(测试执行器):

    测试执行器负责测试执行调度并且生成测试结果给用户;

    测试执行器可以使用图形界面、文本界面或者特定的返回值来展示测试执行结果;

    5)Test Report(测试报告):

    测试报告展示所有执行用例的成功或者失败状态的汇总;包括失败的测试步骤的预期结果和实际结果,还有整体运行状况和运行时间的汇总;

    2.2 使用unittest来写Selenium WebDriver测试

    一般的测试可被拆分为3部分,即3A`s:

    1)Arrange:初始化前置条件,初始化被测试的对象,相关配置和依赖;

    2)Act:执行功能操作;

    3)Assert:用来校验实际结果与预期结果是否一致;

    这是一种方法,我们接下来将应用此方法来为unittest创建测试;

    2.3 用TestCase类来实现一个测试

    我们将通过集成TestCase类并且 在测试类中为每一个测试添加测试方法来创建单个测试或者一组测试;

    TestCase中的assert方法,最主要的任务是 调用assertEqual()来校验结果;assertTrue()来验证条件;assertRaises来验证预期的异常;

    除了添加测试,还可以添加测试夹具,setUp()方法和tearDown()方法;

    一个测试用例是从setUp()方法开始执行,因此可以在每个测试开始前执行一些初始化的任务;此方法无参数,也无返回值;

    接着编写test方法,这些测试方法命名为test开头,这种命名约定通知test runner哪个方法代表测试方法;

    值得注意的是:test runner能找到的每个测试方法,都会在执行测试方法之前先执行setUp()方法,这样有助于确保每个测试方法都能够依赖于相同的环境;

    tearDown()方法会在测试执行完成之后调用,用来清理所有的初始值;

    最后就是运行测试:为了能通过命令行测试,我们可以在测试中添加对main方法的调用;我们将传递verbosity参数以便使详细的测试结果展示在控制台;

    测试代码如下:

    # -*- coding:utf-8 -*-
    
    import unittest
    from selenium import webdriver
    
    class SearchTest(unittest.TestCase):
        def setUp(self):
            self.driver = webdriver.Firefox()
            self.driver.implicitly_wait(15)
            self.driver.maximize_window()
    
            self.driver.get('http://www.baidu.com')
    
        def test_search_by_category(self):
            self.search_field = self.driver.find_element_by_id("kw")
            self.search_field.clear()
            self.search_field.send_keys('铜钱贯')
            self.search_field.submit()
    
            products = self.driver.find_elements_by_xpath("//div[contains(@class, 'c-abstract')]")
    
            self.assertEqual(10, len(products))
    
        def tearDown(self):
            self.driver.quit()
    
    if __name__ == '__main__':
        unittest.main(verbosity=2)

    如果测试通过则,浏览器最后会退出,如果出错的话,控制台则会打印出相关信息:

    通过终端命令行运行的结果如下:

    修改预期值,测试报错:

    上一个实例,我们添加了一个测试,我们还可以用一组测试来构建一个测试类;这样有助于为一个特定功能创建一组更合乎逻辑的测试;

    新的测试方法命名同样要以test开头;简单测试我们复制第一个示例中的测试,修改测试方法名;通过终端再次运行:(searchtest.py)

    # -*- coding:utf-8 -*-
    
    import unittest
    from selenium import webdriver
    
    class SearchTest(unittest.TestCase):
        def setUp(self):
            self.driver = webdriver.Firefox()
            self.driver.implicitly_wait(15)
            self.driver.maximize_window()
    
            self.driver.get('http://www.baidu.com')
    
        def test_search_by_category(self):
            self.search_field = self.driver.find_element_by_id("kw")
            self.search_field.clear()
            self.search_field.send_keys('铜钱贯')
            self.search_field.submit()
    
            products = self.driver.find_elements_by_xpath("//div[contains(@class, 'c-abstract')]")
    
            self.assertEqual(11, len(products))
    
        def test_search_by_category1(self):
            self.search_field = self.driver.find_element_by_id("kw")
            self.search_field.clear()
            self.search_field.send_keys('铜钱贯')
            self.search_field.submit()
    
            products = self.driver.find_elements_by_xpath("//div[contains(@class, 'c-abstract')]")
    
            self.assertEqual(10, len(products))
    
        def tearDown(self):
            self.driver.quit()
    
    if __name__ == '__main__':
        unittest.main(verbosity=2)

    运行结果如下:

    同时我们看到这这样的一个效果:两个Firefox的实例打开和关闭,对应setUp()和tearDown()方法执行的结果;

    为了能让各个测试方法共用一个Firefox实例,我们可以创建类级别的setUp()和tearDown()方法:

    1)通过setUpClass()方法和tearDownClass()方法及@classmethod标识来实现;

    2)这两个方法使在类级别初始化数据,替代了方法级别的初始化;

    我们修改测试脚本,并重新运行:(searchtest1.py)

    # -*- coding:utf-8 -*-
    
    import unittest
    from selenium import webdriver
    
    class SearchTest(unittest.TestCase):
        @classmethod
        def setUpClass(cls):
            cls.driver = webdriver.Firefox()
            cls.driver.implicitly_wait(15)
            cls.driver.maximize_window()
    
            cls.driver.get('http://www.baidu.com')
    
        def test_search_by_category(self):
            self.search_field = self.driver.find_element_by_id("kw")
            self.search_field.clear()
            self.search_field.send_keys('铜钱贯')
            self.search_field.submit()
    
            products = self.driver.find_elements_by_xpath("//div[contains(@class, 'c-abstract')]")
    
            self.assertEqual(11, len(products))
    
        def test_search_by_category1(self):
            self.search_field = self.driver.find_element_by_id("kw")
            self.search_field.clear()
            self.search_field.send_keys('铜钱贯')
            self.search_field.submit()
    
            products = self.driver.find_elements_by_xpath("//div[contains(@class, 'c-abstract')]")
    
            self.assertEqual(10, len(products))
    
        @classmethod
        def tearDownClass(cls):
            cls.driver.quit()
    
    if __name__ == '__main__':
        unittest.main(verbosity=2)

    2.4 学习unittest提供的不同类型的assert方法

    断言:unittest的TestCase类提供了很多实用的方法来校验预期结果和实际结果是否一致;

    assertEqual(a, b [, msg]); assertNotEqual(a, b [, msg]);

    assertTrue(x [, msg]); assertFalse(x [, msg]);

    assertIsNot(a, b [, msg]);

    assertRaises(exc, fun, *args, **kwds);

    ......

    2.5 为一组测试创建TestSuite

    应用unittest的TestSuites特性,可以将不同的测试组成一个逻辑组,然后设置统一的测试套件,并通过一个命令来执行;

    具体通过TestSuites、TestLoader和TestRunner类来实现的;

    我们将上一个脚本命名为searchtest1.py,同时我们新建一个脚本searchtest2.py如下:(searchtest2.py)

    # -*- coding:utf-8 -*-
    
    import unittest
    from selenium import webdriver
    from selenium.common.exceptions import NoSuchElementException
    from selenium.webdriver.common.by import By
    
    class SearchTestHomePage(unittest.TestCase):
        @classmethod
        def setUpClass(cls):
            cls.driver = webdriver.Firefox()
            cls.driver.implicitly_wait(15)
            cls.driver.maximize_window()
    
            cls.driver.get('http://www.baidu.com')
    
        def test_search_by_category(self):
            self.assertTrue(self.is_element_present(By.ID, "kw"))
    
        def test_search_by_category1(self):
            self.search_field = self.driver.find_element_by_id("kw")
            self.search_field.clear()
            self.search_field.send_keys('铜钱贯')
            self.search_field.submit()
    
            products = self.driver.find_elements_by_xpath("//div[contains(@class, 'c-abstract')]")
    
            self.assertEqual(10, len(products))
    
        @classmethod
        def tearDownClass(cls):
            cls.driver.quit()
    
        def is_element_present(self, how, what):
            """"""
            try:
                self.driver.find_element(by=how, value=what)
            except NoSuchElementException as e:
                return False
            return True
    
    if __name__ == '__main__':
        unittest.main(verbosity=2)

    接下来,我们来看看TestSuites特性是如何工作的:

    新建另一个脚本如下:(searchtestsuites.py)

    # -*- coding:utf-8 -*-
    
    import unittest
    from searchtest1 import SearchTest
    from searchtest2 import SearchTestHomePage
    
    search_test = unittest.TestLoader().loadTestsFromTestCase(SearchTest)
    search_test_homepage = unittest.TestLoader().loadTestsFromTestCase(SearchTestHomePage)
    
    smoke_tests = unittest.TestSuite([search_test, search_test_homepage])
    
    unittest.TextTestRunner(verbosity=2).run(smoke_tests)
    

    通过IDE我们运行这个脚本:

    在这个脚本示例中:

    我们使用TestSuites类来定义和执行测试套件,将多可测试加到一个测试套件中;还用TestLoader和TextTestRunner创建和运行测试套件;

    2.6 使用unittest扩展来生成HTML格式的测试报告

    基于之前的脚本示例,我们基本可以体会unittest的强大,但对于输出结果也许并不满意,我们可能需要生成一个所有测试的执行结果作为报告发给同组的其他人员;因此我们需要一个格式更加友好的测试报告,既能够查看测试结果,又能深入各个细节;

    我们可以使用unittest的扩展HTMLTestRunner来实现;

    现在我们来修改上一个示例脚本,并创建一个包含实际测试报告的输出文件:(searchtestsuiteshtml.py)

    # -*- coding:utf-8 -*-
    
    import unittest
    
    import HTMLTestRunner
    import os
    
    from searchtest1 import SearchTest
    from searchtest2 import SearchTestHomePage
    
    from datetime import date
    
    now = date.today()
    datestr = now.strftime('%m-%d-%y')
    
    dir = os.getcwd()
    
    search_test = unittest.TestLoader().loadTestsFromTestCase(SearchTest)
    search_test_homepage = unittest.TestLoader().loadTestsFromTestCase(SearchTestHomePage)
    
    smoke_tests = unittest.TestSuite([search_test, search_test_homepage])
    
    filepath = dir + "/SmokeTestReport{}.html".format(datestr)
    with open(filepath, 'wb') as outfile:
        runner = HTMLTestRunner.HTMLTestRunner(stream=outfile, title='Title:Test Report', description='Des:Smoke Tests')
        runner.run(smoke_tests)
    
    

    将下载的脚本直接添加到工程使用可能会报错,这是因为现在的HTMLTestRunner对应的是Python2的版本;

    可以在这里得到对应修改后的脚本文件;

    运行脚本我们得到了一个SmokeTestReport06-08-18.html的输出文件:

    这就是我们预期生成的测试报告文件;

     

    关于断言的使用,还很浅显,需要结合页面中不同类型的htnl元素进行断言,接下来学习如何定义和使用定位器来与之交互;

    2.7 上述脚本中存在的问题

    在后续和同事交流的实践中,我们发现了一个问题,在这里单独作为一个小节,简要说明下;

    对于searchtest1.py这个脚本,由于第二个测试用例是复制的第一个,所以在运行的时候,我并没有发现什么不对,但是如果把第二个测试用例的搜索内容进行了修改,问题就会出现:重新submit之后的搜索结果并没有打印出来;

    经过一番尝试和修改,新的脚本如下:

    # -*- coding:utf-8 -*-
    
    import unittest
    from selenium import webdriver
    
    import time
    
    
    class SearchTest(unittest.TestCase):
        @classmethod
        def setUpClass(cls):
            cls.driver = webdriver.Firefox()
            cls.driver.implicitly_wait(15)
            cls.driver.maximize_window()
    
            cls.driver.get('http://www.baidu.com')
    
        def test_search_by_category(self):
            self.search_field = self.driver.find_element_by_id("kw")
            self.submit_field = self.driver.find_element_by_id("su")
    
            self.search_field.clear()
            self.search_field.send_keys('铜钱贯')
    
            self.submit_field.submit()
    
            products = self.driver.find_elements_by_xpath("//div[contains(@class, 'c-abstract')]")
            for product in products:
                print("1" + product.text)
            self.assertEqual(10, len(products), 'alert description tqg')
    
        def test_search_by_category1(self):
            self.search_field = self.driver.find_element_by_id("kw")
            self.submit_field = self.driver.find_element_by_id("su")
    
            self.search_field.clear()
            self.search_field.send_keys('路飞')
    
            self.submit_field.click()
            time.sleep(2)
            products = self.driver.find_elements_by_xpath("//div[contains(@class, 'c-abstract')]")
    
            for product in products:
                print("2" + product.text)
    
            self.assertEqual(6, len(products), 'alert description lufei')
    
        @classmethod
        def tearDownClass(cls):
            cls.driver.quit()
    
    if __name__ == '__main__':
        unittest.main(verbosity=2)

    问题出在:

    对于当前页的搜索submit之后,结果没能返回的时候 就已经进行了断言,显然这是不对的;

    我们修改使用搜索按钮的click()方法,然后导入time模块,调用sleep()方法强制等待2s,等待当前界面对“路飞”的搜索结束之后在进行断言;

    相关联的,这个问题引入了等待响应的方式问题,我们后续学习;

     

    小结-序

    伴随着前两章内容的实践,我们了解到了一个基本的自动化测试脚本是如何编写、执行和使用的,我们要做的还有很多;接下来我们要学习更多高级的内容,包括元素定位、元素的等待机制等,在简单略读了整本参考书籍之后,还有很多优秀的第三方测试工具可以帮助我们更简单、更强大的实现测试需求,鉴于对正本书的内容有了一个整体的认识,我将调整接下来笔记的梳理方式,更多的结合实际的测试场景去总结和学习,也方便大家交流!

     

    三、元素定位

    页面元素:

    web应用是包含 超文本标记语言(HTML)、层叠样式表(CSS)、JavaScript脚本组成的Web页面集合;

    基于的用户交互有 跳转到指定的 统一资源定位(URL)网站,单击提交,向服务发送请求,处理服务器响应资源;

    浏览器使用以上资源生成Web页面,构建Web视觉元素;如 文本框 按钮 标签页 图标 复选框 单选按钮 列表 图片等;

    这些视觉元素或控件都被Selenium称为页面元素(WebElements);

     

    本章我们需要掌握的是:Selenium WebDriver定位元素的方法;如何用浏览器开发者模式辅助定位元素;

     

    定位元素的方法其实有很多:通过id、name、class属性定位,利用xpath和css选择器定位;在定位到元素之后,我们可以使用Selenium WebDriver与之自动化交互;

    在前两章的学习过程中,我们已经使用过了一些元素定位的方法;在浏览器中我们可以通过查看元素/源文件的方式来查看页面结构;(具体的查询更多的是靠对html文档结构的熟悉,多多阅读前端页面,好处多多)

    Safari的开发模式也是很好用的;

    3.1 元素定位

    为了模拟用户操作,我们需要告诉Selenium如何定位元素,如何查看元素的属性和状态;

    这里再次将之前实践的针对百度搜索的较完整测试脚本拿过来进行说明;(TqgWebTestProject testBaiduSearch.py)

    import unittest
    from selenium import webdriver
    from selenium.common.exceptions import NoSuchElementException
    from selenium.webdriver.common.by import By
    
    class BaiduSearchKeyword(unittest.TestCase):
        @classmethod
        def setUpClass(cls):
            cls.driver = webdriver.Firefox()
            cls.driver.implicitly_wait(5)
            cls.driver.maximize_window()
    
            cls.driver.get('http://www.baidu.com')
    
        def is_element_present(self, how, what):
            try:
                self.driver.find_element(by=how, value=what)
            except NoSuchElementException as e:
                return False
            return True
    
        def test_search_by_tqg_justify(self):
            self.assertTrue(self.is_element_present(By.ID, 'kw'))
    
        def test_search_by_tqg(self):
            self.search_field = self.driver.find_element_by_id('kw')
            self.submit_field = self.driver.find_element_by_id('su')
    
            self.search_field.clear()
            self.search_field.send_keys('铜钱贯')
    
            self.submit_field.click()
    
            products = self.driver.find_elements_by_xpath("//div[contains(@class,'c-abstract')]")
            self.assertTrue(self.driver.title.__contains__('铜钱贯'))
            for product in products:
                print("铜钱贯 查询结果:" + product.text)
    
        @classmethod
        def tearDownClass(cls):
            cls.driver.quit()
    
    
    if __name__ == '__main__':
        unittest.main(verbosity=2)
    

     

    这个脚本之前已经学习过,很简单 两个测试用例分别是 校验元素是否存在 存在之后使用它进行搜索,断言搜索结果中包含搜索的指定关键字;

     

    要搜索一个产品,需要先找到搜索框和搜索按钮,接着通过键盘输入要查询的关键字,最后用鼠标单击搜索按钮,提交搜索请求;

    这是人工的操作,我们希望Selenium能模拟这个过程,这就需要我们程序化地告诉Selenium如何定位,模拟鼠标的动作等;

    Selenium提供了很多find_element_by方法定位页面元素,正常定位的话,相应的WebElement实例会被返回,反之将抛出NoSuchElementException的异常;

    Selenium还提供了多种find_elements_by方法去定位多个元素,返回的是list数组;

    8种find_element_by方法:

    ——find_element_by_id()

    ——find_element_by_name()

    ——find_element_by_class_name()

    ——find_element_by_tag_name()

    ——find_element_by_xpath()

    ——find_element_by_css_selector()

    ——find_element_by_link_text()#标签之间的文本信息

    ——find_element_by_partial_link_text()

     

    find_elements_by方法按照一定的标准返回一组元素:

    ——find_elements_by_id()

    ——find_elements_by_name()

    ——find_elements_by_class_name()

    ——find_elements_by_tag_name()

    ——find_elements_by_xpath()

    ——find_elements_by_css_selector()

    ——find_elements_by_link_text()

    ——find_elements_by_partial_link_text()

     

    我们可以通过浏览器产看html页面元素,找到搜索框(参照之前脚本):

    值得一提的是class定位:

    class属性是用来关联CSS中定义的属性的;

    通过对元素ID、name、class属性来查找元素是最为普遍和快捷的方法;

    也可以增加一个测试用例断言元素的可用性:

        def test_search_by_tqg_enable(self):
            self.submit_field = self.driver.find_element_by_id('su')
            self.assertTrue(self.submit_field.is_enabled())

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 自动化测试课程是2019年录制,采用selenium3和python3.7版本,分为9章36节课, 零基础讲解自动化测试selenium安装到八种元素定位,用户事件处理,等待时间处理,到单元测试框架Unitest整合实战,整合自动化测试...
  • Python+Selenium珠联璧合将为自动化测试提供有力的保障,本套课程将会详细的给大家讲解Selenium使用方法,Webdriver API和Python基础语法知识等等,让大家在自动化测试项目中得到更好的运用! 任务作业: 作业链接...
  • Selenium 自动化测试从零实战

    万次阅读 2017-11-20 16:11:49
    作者简介本文作者就职于中科软科技股份有限公司高级测试工程师-王海宝(勇气老师),3年以上软件测试经验,擅长接口测试、自动化测试,对分布式测试有独到的见解,擅长测试分析。下面一起看看勇气老师如何带大

    [运营专题]零预算引爆个人和企业品牌【原文链接】
    原来这样做,才能向架构师靠近【原文链接】
    Cordova App 打包全揭秘【原文链接】
    TensorFlow on Android:物体识别【原文链接】
    TensorFlow on Android:训练模式【原文链接】
    图解敏捷教练和 ScrumMaster【原文链接】

    说在前面:达人课是GitChat的一款轻阅读产品,由特约讲师独家发布。每一个课程你都可获得6-12篇的深度文章,同时可在读者圈与讲师互动交流。GitChat达人课,让技术分享更简单。进入我的GitChat

    这里写图片描述

    作者简介

    本文作者就职于中科软科技股份有限公司高级测试工程师-王海宝(勇气老师),3年以上软件测试经验,擅长接口测试、自动化测试,对分布式测试有独到的见解,擅长测试分析。下面一起看看勇气老师如何带大家从零开始。查看原文

    课程简介

    本课程注重自动化实践,同时讲解一些基础的自动化测试理念,以及常用的 Java 思维,以便快速理解并掌握自动化测试体系、掌握自动化测试的基础核心内容以及自动化框架的整合实现。以“亚马逊购物流程”为例,着重讲解调用被测元素、测试框架 TestNG 的使用,尽量做到让刚入门自动化的读者也能感受到自动化的魅力。

    导读:自动化定位解析

    写在前面的话

    测试自动化是现在的一种趋势,更是许多厌倦功能测试想转型高端测试的测试从业者的迫切需求。关于测试自动化的资料比比皆是,但是杂乱无章,而且好多知识只是一带而过,并且更多针对 Selenium 这块的测试以 Python 语言居多,Java 语言很少。其实,Java 语言更加灵活,毕竟面向对象语言中 Java 才是当之无愧的王者。

    怎样良好的整合 Java 知识与 Selenium 完美结合,是本课要讲解的内容,同时,会以实际案例来逐步引出 Selenium 的使用。课程主要有以下特色:

    (1)内容由浅入深,零基础自动化人员也能看得懂。

    (2)始终以解决实际问题为出发点,通过实际案例引出 Selenium 的相关知识,最大限度的避免课程枯燥,用生动的语言来描述自动化。

    (3)细化每个实施的细节,希望讲解一个知识点就能彻底的讲透,并且会以一种由浅入深的形式进行讲解。

    说了这么多,希望读者阅读完全部文章后会以最大限度的掌握自动化,并且爱上自动化!好了,下面开始步入正题。

    准备工作

    “工欲善其事必先利其器”,做自动化也是如此,所以先花一点时间来介绍要准备的工作。

    (1)软件工具准备:JDK 和 Eclipse,搭建 Java 的开发环境,需要注意的是二者的版本必须统一,即 32 位的 JDK 必须对应 32 位的 Eclipse。

    (2)框架软件准备:TestNG

    安装方式有两种:

    • help-Eclipse Markplace 市场查找下载安装。 在 TestNG 官网上下载对应版本的插件,help-Install
    • new Software 安装已经下载好的插件。

    当然所有的插件安装都是这两种方式。

    (3)Foxfire(火狐浏览器,建议使用 30~32 版本,目前最新的版本兼容性不好且对插件的支持不够理想)。在火狐浏览器里要下载其插件,必须使用的有:

    • Firebug+firepath 用来辅助我们进行元素定位。
    • Selenium IDE 主要用来验证自动化脚本是不是与实际情况一致。

    需要说明的是,Selenium IDE 本身就有用来做简单 UI 界面录制回放的功能。

    (4)Google Chrome(谷歌浏览器),演示的时候可能只调用火狐浏览器,但是谷歌浏览器是当前 UI 自动化测试的首选,因为其稳定,插件更新快。

    (5)必要的 jar 包

    • log4j-1.2.11.jar,用来支持日志功能的 jar。
    • selenium-server-standalone-2.43.1.jar,核心 jar 必须要有。

    (6)浏览器必要的 driver

    • 谷歌的 chromedriver.exe。
    • IE 的 IEDriverServer64.exe。
    • Windows 10 自带的 Microsoft Edge 的 Microsoft WebDriver。

    写到这里有可能会问,为什么需要这么多的 driver,其实如果只针对一套流程进行自动化操作,只需要操作一个浏览器即可,但是如果想用同一个流程验证不同浏览器的兼容性时,那么需要同时启动多个浏览器,所以提前准备好主流浏览器的 driver,对我们的工作来说是非常有必要的。

    上面的工作全都完成,在 Eclipse 里创建一个纯净的自动化工作目录,将下载好的插件、驱动、jar 都配置好,此时 Eclipse 的工程目录如下图所示:
    这里写图片描述

    其中 files 是新建的目录,用来存储各种浏览器的驱动。lib 也是新建的目录,用来存储各种 jar 包。当然,这两个文件的名称都可以自行改变。好了准备工作到此结束,下面进行定位的讲解。

    定位实战
    - UI 自动化的实质其实就是做下面两件事情:
    - 定位到 Web 界面的被测试元素;
    对定位到的元素进行录入、单击、双击、拖拽、上传文件、清空等等操作的过程。

    请看下面的例子。
    (1)打开百度网站的首页:
    这里写图片描述

    (2)在输入框输入 GitChat:

    这里写图片描述

    此场景运用自动化的思维解决就是:首先要打开一个浏览器 | 在导航栏处输入百度的网址 | 定位到输入框 | 键盘敲入 GitChat 的过程。操作火狐浏览器实现 Java 代码如下:

    package com.test.baidu;
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.firefox.FirefoxDriver;
    
    public class Baidu {
    public static void main(String[] args) {
            //启动火狐浏览器
            WebDriver driver = new FirefoxDriver();
            //将导航栏导航到百度首页
            driver.navigate().to("http://www.baidu.com");
            //定位到输入框
            WebElement element = driver.findElement(By.id("kw"));
            //输入 GitChat
            element.sendKeys("GitChat");
        }
    }

    这里重点先讲解里面的定位问题:

    WebElement element = driver.findElement(By.id("kw"));

    定位方式

    常用的定位方式如下:

    这里写图片描述

    这些都是常用的定位方式,有 by.id、by.name、by.cssSelector、by.xpath 等等。其中除了 by.cssSelector、by.xpath 外,其他的 by 后面的 id、name、link Text 等指的是 HTML 标记语言中页签内的属性内容,如百度输入框的 HTML 源代码如下:

    <span class="bg s_ipt_wr quickdelete-wrap ipthover">
    <span class="soutu-btn"/>
    <input id="kw" class="s_ipt" autocomplete="off" maxlength="255" value="" name="wd"/>
    <a id="quickdelete" class="quickdelete" href="javascript:;" title="清空" style="top: 0px; right: 0px; display: none;"/>
    </span>

    这段代码里的 class、id 就是属性。所以针对百度输入框我们使用的是其 id 的属性。

    xpath 定位

    首先要明白为什么使用 xpath 定位,它的好处有如下几个方面:

    • 方便维护
    • 定位准确
    • 推荐以后大家无论任何被测试对象都采用 xpath 定位的方式

    其次需要了解 xpath 常用符号说明,常用的符号及含义如下所示:
    - /:表示绝对路径,绝对路径是指从跟目录开始
    - //:表示相对路径
    - .:表示当前层
    - ..:表示上一层
    - *:表示通配符
    - @:表示属性
    - []:属性的判断条件表达式

    最后运用上面的符号结合 xapth 的相关语法进行定位演示。

    演示场景

    任找一个 HTML 网页进行定位实战,按照页面代码结构逐级定位得出的结果解释如下,希望通过下面的逐级定位内容能理解相对路径、HTML 的层级结构。

    (1)/html/div:没有节点可以被选择,因为 / 代表绝对路径,本定位表示的是 HTML 下一级目录的元素,很明显 HTML 的下一级是 head 和 body,所以本写法无法定位到任何元素。

    (2)/html//div:选中 HTML 标签中的所有 div 元素,// 相对路径。就完全等价于 //div 的写法。

    (3)//div/div 表示所选择的 div 元素下又包含 div 元素的所有元素。此时完全等价于 //div/div/. 的写法。

    (4)//div/div/..:表示 //div/div 定义到的上一层 div 上。

    (5)//div/div/*:此时会将 div 下的子节点含有 div 的这层节点下的所有元素都匹配到。

    (6)//div[@id=”input”]:此时表示在 div 目录下选择一个 id=input 的子节点。

    and 与 or 连接符在 xpath 中的使用

    and 的使用:此种定位的应用场景为下图所示:

    这里写图片描述

    此种场景的 HTML 编码为:

    <td class="widgetStyle">
    <div id="radio">
    <input class="Volvo" type="radio" name="identity"/>
    <label>Volvo</label>
    <br/>
    <input class="Saab" type="radio" name="identity"/>
    <label>Saab</label>
    <br/>
    <input class="Opel" type="radio" name="identity"/>
    <label>Opel</label>
    <br/>
    <input class="Audi" type="radio" name="identity"/>
    <label>Audi</label>
    </div>

    此时我们想定位到 Saab 怎么写呢?(当然也可以不使用 and 连接符进行书写)书写为://input[@class=”Saab” and @name=”identity”],当然若写成 //input[@class=”Saab”] 肯定也不会有问题。

    or 的使用:如果定位到 Saab 或者定位到 Opel,此时书写方式为://input[@class=”Saab” or @class=”Opel”]。

    定位顺序(从1开始切记)

    现在学习第二种方式,比如定位 Saab。可以这样写://input@name=’identity’,同理定位 Volvo,//input@name=’identity’(这就是一开始强调的,这种写法必须从 1 开始编号)。

    • 定位 Opel,写成://input@name=’identity’
    • 定位 Audi,写成://input@name=’identity’

    常用函数

    Xpath 定位还可以使用一些函数,常用的函数如下:

    (1)contains():包含。若要匹配出 Saab 还可以这样写://input[@name=”identity” and contains(@class,’S’)]

    (2)text():一个节点的文本值。举个例子,这里面篮字显示的英文结果,HTML 代码为:

    <a target="_self" href="/s?rsv_idx=1&amp;wd=111&amp;usm=3&amp;ie=utf-8&amp;sl_lang=en&amp;rsv_srlang=en&amp;rsv_rq=en&amp;rqlang=cn">英文结果</a>

    可见这四个字没有任何属性值信息,所以定位此信息的时候需要使用 text() 函数。场景如下图所示:

    这里写图片描述

    此时定位英文结果即可使用://a[text()=”英文结果”]

    (3)last()函数,定位 Audi 写成 //input@name=’identity’,可以看到 Audi 这个元素本身就处于 input 最后一个了,此时可以使用 last() 函数进行匹配://input[@name=”identity”][last()]。

    (4)starts-with:以 starts-with 为开头写法实例://input[starts-with(@id,’user’)]代表 input 下 id 以 user 为开头的元素。

    (5)not():表示否定,一般情况下会与返回值为 true 或者 false 的函数组合起来使用。比如上面提到的 contains() 与 starts-with。

    用实例来说:现在想要定位到不是 Audi 车除外的三种车元素,此时写法为://input[@name=”identity” and not (contains(@class,’A’))]。

    当然 not() 还有一种特殊用法就是直接 Not。//input[not(@class)] 表示匹配出 input 下所有不含 class 属性的元素。

    总结:唯一需要注意的是所有函数的写法 function(@属性,’内容’)。

    Xpath 轴定位说明

    (1)基本轴

    轴可以在位置路径中快捷引用特定的节点(忽略属性和名称空间节点)。child 例子:

     "child::*"
         当前节点的子节点。  
        "child::childnodename"
         当前节点名为childnodename的子节点。
        "child::text()" 
         当前节点文本子节点。 
        "child::node()"
         当前节点的子节点。
        "child::*/child::nodename"
         取当前节点的子节点的名为nodename的子节点。

    (2)特殊轴

    self 当前节点

    descendant 当前节点的后代(子节点或子节点的子节点…)

    parent 当前节点的父节点

    ancestor 当前节点的祖先节点(父节点和父节点的父节点…)

    preceding 按文档顺序位于当前节点之前的非祖先节点

    attribute 当前节点的属性

    namespace 当前节点的名称空间

    preceding-sibling 当前节点之前的所有兄弟节点

    following 当前节点之后的所有节点

    following-sibling 当前节点之后的所有兄弟节点

    descendant-or-self 当前节点和后代节点

    ancestor-or-self 当前节点和祖先节点

    以上的两种轴类型,没什么好说的,先记住吧。具体怎么用请看下面实例。

    第一个实例:继续定位上述中的 Volvo,使用 xpath 轴书写如下://div[@id=”radio”]/descendant::input1 也可以定位到。

    第二个实例:定义 Audi 上的所有节点,使用 xpath 轴写法如下://input[@name=”identity” and @class=”Audi”]/preceding-sibling::*

    (3)需要注意的几个问题。

    [] 后面需要跟 /,/ 后面在加上关键字。

    轴关键字后面必须使用 ::,这个后面可以接节点名称,如 input、div 等。如果后面跟的是 *,代表全部。

    轴后面接节点名称是节点前面的定位方式全部可以继续适用。

    对于轴的使用建议是能不用就不用,条条大路通罗马,没必要非使用轴进行定位。

    cssSelector 定位

    了解即可,能用 xpath 就不用 cssSelector。原因很简单,HTML 的代码我们更熟悉。

    CSS 常用符号说明

    • #表示 id
    • .表示class
    • : 表示子元素,层级

    值得注意的是:一个空格也表示子元素,但是所有的后代子元素,就相当于 xpath 中的相对路径。

    想知道所有的 CSS 属性建议搜索其他资料学习下。

    最后请记住定位没有最好,只有是否合适。选择最合适的定位方法,就能使得定位变得得心应手。

    下一篇

    课程内容

    导读:自动化定位解析

    第01课:自动化编程的两大重点

    第02课:基于 Selenium 3.0 启动与配置浏览器

    第03课:亚马逊购物流程实战

    第04课:亚马逊购物流程分析

    第05课:工程化整合自动化代码

    第06课:TestNG 与断言类的使用

    第07课:Page Object 自动化框架实施

    展开全文
  • 该视频教程会让学生了解自动化含义,学会主流的Python Selenium自动化环境搭建,八大定位,基本方法使用、以及用多种方法介绍Select、Frame,上传附件。   相关课程推荐: 软件测试之java selenium3自动化测试...
  • Selenium 自动化测试 - 使用手册

    万次阅读 2020-07-18 07:19:12
    Selenium 是一个 Web 应用的自动化框架。通过它可以写出自动化程序,在浏览器里操作 Web 界面,从 Web 界面获取信息。 Selenium 自动化流程如下: 自动化程序调用 Selenium 客户端库函数(比如点击按钮元素)。 ...
  • 前言: 总感觉自己的Selenium用的很溜,很熟悉了,现在发现比较零碎,不是那么的系统,所以想要总结下Selenium相关的知识点,作为回顾总结;然后就想写一系列的,从零开始,不知道是不是能够坚持在业余时间内总结完...
  • selenium自动化测试(一)

    千次阅读 2015-07-25 10:45:08
    什么是自动化测试? (广义)一切能代替或辅助手工测试的行为,包括性能测试工具(jmeter,ab);  (狭义)通过工具或编写脚本的方式模拟手工测试的过程,通过回放或运行脚本来自动执行测试用例,从而代替人工对系统的...
  • Selenium自动化测试:文件上传自动化

    万次阅读 2018-08-24 16:38:53
    在给web页面做自动化的时候,文件上传是很常见的操作,例如基本的用户头像上传或者一些涉及到文件传输和储存的地方都需要先进行上传文件的操作,那么,该如何通过selenium完成文件上传自动化的实现呢? 首先,我们...
  • Selenium自动化测试基于Python

    千次阅读 2020-09-25 15:31:56
    Selenium是一个主要用于Web应用程序自动化测试的工具集合,在行业内已经得到广泛的应用。介绍了如何用Python语言调用Selenium WebDriver接口进行自动化测试。主要内容为:基于Python 的 SeleniumWebDriver 入门知识...
  • 自动化测试,一个被炒的火热的词,各大公司都在嚷嚷着要上自动化测试的项目,都在招聘各种自动化测试人员,由于工作的原因,目前所见的自动化测试在金融系统应用中较为广泛,所投入的人力物力在整个测试中也是占了...
  • 分享我的第一次Selenium自动化测试框架开发过程

    万次阅读 多人点赞 2017-08-19 14:08:40
    由于本人没有Java开发经验,以前虽然学过QTP但从没有接触过Selenium,正好通过这个机会能学习一下自动化测试,同时也学习一下基本的Java开发过程。 一、首先是搭建框架开发环境 按照网上的方法部署eclipse,建立...
  • Selenium 自动化测试系统

    千次阅读 2009-12-11 21:02:00
    Selenium 自动化测试系统 1.官网 http://seleniumhq.org/ 标题为:Selenium web application testing system 其实selenium已经做得很好了,使用的人都不用很强的编程基础. 2.先来介绍如何安装selenium IDE吧...
  • Selenium自动化测试-入门

    万次阅读 多人点赞 2017-06-18 14:24:28
    SeleniumSelenium 是一个浏览器自动化测试框架,它主要用于web应用程序的自动化测试,其主要特点如下:开源、免费;多平台、浏览器、多语言支持;对web页面有良好的支持;API简单灵活易于使用;支持分布式测试用例...
  • selenium自动化测试之测试结果验证

    千次阅读 2018-10-11 14:39:42
    selenium广泛应用于B/S架构,如何通过selenium来验证测试结果的正确性呢。 案例分析:以百度为例,一起来看看如何验证测试结果的正确性。 点击百度首页的“hao123”后; 跳转至"hao123"页面 验证:是否...
  • 测试工程 1. 测试需求:访问百度主页,搜索某个关键词,并验证搜索结果页面的标题。 2. 手工操作验证步骤: 1. 打开 Chrome 浏览器,输入百度的网址“www.baidu.com"; 2. 在搜索输入框中输入关键词“VS ...
  • selenium自动化测试面试集合

    千次阅读 2018-02-05 16:46:52
    1、如何提高selenium脚本的执行速度? Selenium脚本的执行速度受多方面因素的影响: 网速;操作步骤的繁琐程度;页面加载的速度;脚本中设置的等待时间;运行脚本的线程数;能稳定的视线回归测试是关键; ...

空空如也

1 2 3 4 5 ... 20
收藏数 141,508
精华内容 56,603
关键字:

selenium