精华内容
下载资源
问答
  • 自动化脚本编写实例-python

    万次阅读 多人点赞 2017-07-03 13:32:15
    自动化脚本编写实例

    自动化脚本编写实例

    完整demo请参看:https://github.com/niununu/k2p_web_test

    本文以修改用户名密码单元为案例,编写测试脚本。完成修改用户名密码模块单元测试。

    (ps.这个demo中登陆密码为“admin”)

    1. 打开浏览器,访问p.to

    # 1. 打开浏览器,访问p.to
    driver = webdriver.Chrome()
    def openDriver():
        driver.get("http://p.to")
        driver.maximize_window()

    2. 登陆

    登陆这动作传入的参数只有一个“用户密码”

    需要执行的操作有两个:1. 向输入框输入密码 2. 点击确定

    需要注意的是在登陆的时候可能出现页面还没有加载出来,我们的程序就开始填写表单的情况。

    为了防止异常出现,编写了函数waitandSendkeys和waitandClick来处理异常。(后面将会介绍异常处理函数)

    class loginClass(object):
        """docstring for login"""
        def __init__(self, arg):
            self.login_pwd = arg
        def login(self):
            waitandSendkeys('//*[@id="Pwd"]', self.login_pwd)
            waitandClick('//*[@id="Save"]')

    3. 修改管理员密码

    需要传入的参数有两个:1.旧密码 2. 新密码

    要注意的是由于修改管理员密码是一个弹窗,所以要判断等弹窗弹出之后再进行操作

    class changePwdClass(object):
        """docstring for changePwdClass"""
        def __init__(self, pwdNew, pwdOld):
            self.pwdNew = pwdNew        
            self.pwdOld = pwdOld
    
        def changeUserPwd(self):
            waitandClick('//*[@id="Con"]/div[1]/ul[2]/li[1]')
            waitandClick('//*[@id="Con"]/div[1]/ul[2]/li[1]/ul/li[3]')
            waitforDisplay('//*[@id="_Widget"]')
            waitandSendkeys('//*[@id="PwdOld"]', self.pwdOld)
            waitandSendkeys('//*[@id="PwdNew"]', self.pwdNew)
            waitandSendkeys('//*[@id="PwdCfm"]', self.pwdNew)
            waitandClick('//*[@id="SavePwd"]')

    到这里,我们可以完成修改用户名密码这一动作。后面将进行单元测试。

    4. 单元测试数据

    修改用户名密码这个功能的防呆规则如下:

    输入项允许输入可为空格式规范合法性依赖项
    原管理员密码字符串长度限制:5-63; 字符集:英文字符集;需要与管理员密码相同
    新管理员密码字符串长度限制:5-63; 字符集:英文字符集;
    确认管理员密码字符串需要与新管理员密码相同

    根据防呆规则可以列出:1.可能出现的错误 2.出现错误时页面应有的提示语

    #可能出现的错误
    errcode = ['oldPwdErr', 'lenErr', 'charErr', 'matchErr', 'pwdSameErr',\
        'oldPwdBlankErr', 'newPwdBlankErr']
    
    #出现错误时页面应有的提示语
    errTips = {
        'oldPwdErr' :'原密码错误',
        'lenErr' : '新密码长度应为5~63位',
        'charErr' : "新密码包含非法字符",
        'matchErr' : '两次密码输入不一致',
        'pwdSameErr' : '新密码与原密码相同,请重新输入',
        'oldPwdBlankErr' : '请输入原密码',
        'newPwdBlankErr' : '请输入新密码'
    }

    5. 检查输入的数据合法性

    需要输入的数据为要检查的data和登陆密码

    def checkData(data, loginPwd):#检查顺序跟页面顺序相同
        pwd = loginPwd
        #'oldPwdBlankErr'
        if data['pwdOld'] == "":
            return errcode[5]
        #newPwdBlankErr
        if data['pwdNew'] == "":
            return errcode[6]
        #charErr
        strTmp = data['pwdNew']
        for x in xrange(0,len(data['pwdNew'])):
            if ord(strTmp[x]) < 33 or ord(strTmp[x]) > 127:#ASCII表示范围:32-127
                return errcode[2]
        #lenErr
        if len(data['pwdNew']) > 63 or len(data['pwdNew']) < 5:
            return errcode[1]
        #oldPwdErr
        if pwd != loginData.login_data['login_pwd']:
            return errcode[0]
        #pwdSameErr
        if data['pwdNew'] == pwd:
            return errcode[4]
        #no error
        return None

    6. 获取输入错误数据之后的页面提示语

    def checkResponse(error):
        if error == None:
            return
    
        webText = getText('//*[@id="PwdTip"]')
        if webText == False:#没有提示
            print('###Error: no tips on web!')
        else:
            webText = webText.decode('UTF-8')
        waitandClick('//*[@id="ModifyPwd"]/i')
        time.sleep(1)
        return webText

    7. 编写测试用例

        data = [
            {"pwdNew" : "12345678","pwdOld" : '8dadla'},#"oldPwdErr"
            {"pwdNew" : "admi","pwdOld" : 'admin'},#lenErr
            {'pwdNew' : '1  2  3','pwdOld' : 'admin'},#charErr
            {'pwdNew' : 'admin','pwdOld' : 'admin'},#pwdSameErr
            {'pwdNew' : "",'pwdOld' : ""},#oldPwdBlank
            {'pwdNew' : "",'pwdOld' : "admin"}#newPwdBlank
        ]

    8.编写单元测试类

    8.1 单元测试中的通用操作

    单元测试中,不同的部分应该是数据,所以可以定义一个通用的操作。

    其中self.assertEqual(checkResponse(error), errTips[error])是判定测试是否通过的条件:页面提示语是否正确。

    def commonAction(self, arg):
            error = checkData(arg)
            changeUserPwd.main(arg)
            self.assertEqual(checkResponse(error), errTips[error])

    8.2 测试类

    测试类中主要包括了测试用例6个,和对应的以“test”开头的测试函数。

    这里继承了python的unittest。

    关于unittest的语法请参考:http://www.jb51.net/article/65856.htm

    class TestCase(unittest.TestCase):
        data = [
            {"pwdNew" : "12345678","pwdOld" : '8dadla'},#"oldPwdErr"
            {"pwdNew" : "admi","pwdOld" : '*'},#lenErr
            {'pwdNew' : '1  2  3','pwdOld' : '*'},#charErr
            {'pwdNew' : 'admin','pwdOld' : '*'},#pwdSameErr
            {'pwdNew' : "",'pwdOld' : ""},#oldPwdBlank
            {'pwdNew' : "",'pwdOld' : "*"}#newPwdBlank
        ]
    
        def commonAction(self, arg):
            error = checkData(arg)
            changeUserPwd.main(arg)
            self.assertEqual(checkResponse(error), errTips[error])
    
        def test_oldPwdErr(self):
            self.commonAction(self.data[0])
        def test_lenErr(self):
            self.commonAction(self.data[1])
        def test_charErr(self):
            self.commonAction(self.data[2])
        def test_pwdSameErr(self):
            self.commonAction(self.data[3])
        def test_oldPwdBlank(self):
            self.commonAction(self.data[4])
        def test_newPwdBlank(self):
            self.commonAction(self.data[5])

    9. 进行单元测试并生成测试报告

    这里利用了HTMLTestRunner来生成测试报告。

    HTMLTestRunner语法请参看:https://testerhome.com/topics/7576

    生成的测试报告将会存放在reports/test_report文件夹下,按照时间命名。测试报告的title叫做“修改管理员密码试报告”

    unittest.main(testRunner=HtmlTestRunner.HTMLTestRunner(output='test_report',report_title='修改管理员密码试报告'))

    10. 关闭浏览器

    def closeDriver():
        time.sleep(3)
        driver.quit()
        os.system('killall chromedriver')
        os.system('killall geckodriver')

    到这里,我们可以完成修改用户名密码模块的单元测试了,为了增加代码的健壮性,下面介绍异常处理。

    11. 异常处理

    11.1 点击函数

    点击按钮的时候可能出现的异常情况是:可能页面元素还没有加载出来的时候,点击的动作就发生了。这样就会引发找不到元素异常。

    解决的方法是通过显示等待,每10ms检查一次页面元素是否加载完成,完成后就点击,否则就等到超时时间之后结束动作。

    def waitandClick(xpath):
        try:
            WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, xpath)))
        except TimeoutException as e:
            print('Error:waitandClick, TimeoutException, xpath = %s\n' % xpath)
        else:
            driver.find_element_by_xpath(xpath).click()

    11.2 填写表单

    在填写表单时,除了页面元素还没有加载完成的异常外,还可能原有表单中有文本,而我们的输入则是以追加模式填写的。这就会导致填写的文本不准确。

    def waitandSendkeys(xpath, keys):
        try:
            WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, xpath)))
        except TimeoutException as e:
            print('Error:waitandSendkeys, TimeoutException, xpath = %s\n' % xpath)
        else:
            driver.find_element_by_xpath(xpath).clear()
            driver.find_element_by_xpath(xpath).send_keys(keys)

    11.3 元素加载

    在元素加载中可能出现: 1. 在超时时间内元素没有加载完成 2. 查询的元素根本不存在

    针对这两种情况进行异常处理:

    def waitforDisplay(xpath):
        try:
            WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, xpath)))
        except TimeoutException as e:
            print('Error:waitforDisplay, TimeoutException, xpath = %s\n' % xpath)
        else:
            try:
                process = driver.find_element_by_xpath(xpath)
                WebDriverWait(driver, 10).until(lambda driver: process.is_displayed())
            except NoSuchElementException as e:
                print('Error:waitforDisplay, NoSuchElementException, xpath = %s\n' % xpath)

    12. 测试报告和代码示例

    12.1 测试报告样例

    demo

    12.2 完整的测试代码

    # -*- coding: UTF-8 -*-
    #!/usr/bin/env python
    
    from selenium import webdriver
    
    import time, os
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    from selenium.common.exceptions import NoSuchElementException
    from selenium.common.exceptions import TimeoutException
    
    import unittest
    import HtmlTestRunner
    import sys
    reload(sys)
    sys.setdefaultencoding('utf-8') 
    
    
    # 1. 打开浏览器,访问p.to
    driver = webdriver.Chrome()
    def openDriver():
        driver.get("http://p.to")
        driver.maximize_window()
    
    # 2. 登陆
    class loginClass(object):
        """docstring for login"""
        def __init__(self, arg):
            self.login_pwd = arg
    
        def login(self):
            waitandSendkeys('//*[@id="Pwd"]', self.login_pwd)
            waitandClick('//*[@id="Save"]')
    
    def login(data):
        openDriver()
        test1 = loginClass(data)
        test1.login()
    
    # 3.修改管理员密码
    class changePwdClass(object):
        """docstring for changePwdClass"""
        def __init__(self, arg):
            self.pwdNew = arg.get('pwdNew', '')
            self.pwdOld = arg.get('pwdOld', '')
    
        def changeUserPwd(self):
            waitandClick('//*[@id="Con"]/div[1]/ul[2]/li[1]')
            waitandClick('//*[@id="Con"]/div[1]/ul[2]/li[1]/ul/li[3]')
            waitforDisplay('//*[@id="_Widget"]')
            waitandSendkeys('//*[@id="PwdOld"]', self.pwdOld)
            waitandSendkeys('//*[@id="PwdNew"]', self.pwdNew)
            waitandSendkeys('//*[@id="PwdCfm"]', self.pwdNew)
            waitandClick('//*[@id="SavePwd"]')
    
    def changeUserPwd_main(data):
        changePwdObj = changePwdClass(data)
        changePwdObj.changeUserPwd()
    
    # 4. 单元测试数据
    errcode = ['oldPwdErr', 'lenErr', 'charErr', 'matchErr', 'pwdSameErr',\
        'oldPwdBlankErr', 'newPwdBlankErr']
    errTips = {
        'oldPwdErr' :'原密码错误',
        'lenErr' : '新密码长度应为5~63位',
        'charErr' : "新密码包含非法字符",
        'matchErr' : '两次密码输入不一致',
        'pwdSameErr' : '新密码与原密码相同,请重新输入',
        'oldPwdBlankErr' : '请输入原密码',
        'newPwdBlankErr' : '请输入新密码'
    }
    
    # 5. 检查输入的数据合法性
    def checkData(data):#检查顺序跟页面顺序相同
        #pwd = loginPwd
        pwd='admin'
        #'oldPwdBlankErr'
        if data['pwdOld'] == "":
            return errcode[5]
        #newPwdBlankErr
        if data['pwdNew'] == "":
            return errcode[6]
        #charErr
        strTmp = data['pwdNew']
        for x in xrange(0,len(data['pwdNew'])):
            if ord(strTmp[x]) < 33 or ord(strTmp[x]) > 127:#ASCII表示范围:32-127
                return errcode[2]
        #lenErr
        if len(data['pwdNew']) > 63 or len(data['pwdNew']) < 5:
            return errcode[1]
        #oldPwdErr
        if pwd != data['pwdOld']:
            return errcode[0]
        #pwdSameErr
        if data['pwdNew'] == data['pwdOld']:
            return errcode[4]
        #no error
        return None
    
    # 6. 获取输入错误数据之后的页面提示语
    def checkResponse(error):
        if error == None:
            return
        # webText = driver.find_element_by_xpath('//*[@id="PwdTip"]').text
        webText = getText('//*[@id="PwdTip"]')
        if webText == False:#没有提示
            print('###Error: no tips on web!')
        else:
            webText = webText.decode('UTF-8')
        waitandClick('//*[@id="ModifyPwd"]/i')
        return webText
    
    # 8.单元测试类
    class TestCase(unittest.TestCase):
        # 7. 编写测试用例
        data = [
            {"pwdNew" : "12345678","pwdOld" : '8dadla'},#"oldPwdErr"
            {"pwdNew" : "admi","pwdOld" : 'admin'},#lenErr
            {'pwdNew' : '1  2  3','pwdOld' : 'admin'},#charErr
            {'pwdNew' : 'admin','pwdOld' : 'admin'},#pwdSameErr
            {'pwdNew' : "",'pwdOld' : ""},#oldPwdBlank
            {'pwdNew' : "",'pwdOld' : "admin"}#newPwdBlank
        ]
    
        def commonAction(self, arg):
            error = checkData(arg)
            changeUserPwd_main(arg)
            self.assertEqual(checkResponse(error), errTips[error])
            time.sleep(1)
    
        def test_oldPwdErr(self):
            self.commonAction(self.data[0])
        def test_lenErr(self):
            self.commonAction(self.data[1])
        def test_charErr(self):
            self.commonAction(self.data[2])
        def test_pwdSameErr(self):
            self.commonAction(self.data[3])
        def test_oldPwdBlank(self):
            self.commonAction(self.data[4])
        def test_newPwdBlank(self):
            self.commonAction(self.data[5])
    
    # 10. 关闭浏览器
    def closeDriver():
        time.sleep(3)
        driver.quit()
        os.system('killall chromedriver')
        os.system('killall geckodriver')
    
    # 11. 异常处理
    ## 11.1 点击函数
    def waitandClick(xpath):
        try:
            WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, xpath)))
        except TimeoutException as e:
            print('Error:waitandClick, TimeoutException, xpath = %s\n' % xpath)
        else:
            driver.find_element_by_xpath(xpath).click()
    
    ## 11.2 填写表单
    def waitandSendkeys(xpath, keys):
        try:
            WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, xpath)))
        except TimeoutException as e:
            print('Error:waitandSendkeys, TimeoutException, xpath = %s\n' % xpath)
        else:
            driver.find_element_by_xpath(xpath).clear()
            driver.find_element_by_xpath(xpath).send_keys(keys)
    
    ## 11.3 元素加载
    def waitforDisplay(xpath):
        try:
            WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, xpath)))
        except TimeoutException as e:
            print('Error:waitforDisplay, TimeoutException, xpath = %s\n' % xpath)
        else:
            try:
                process = driver.find_element_by_xpath(xpath)
                WebDriverWait(driver, 10).until(lambda driver: process.is_displayed())
            except NoSuchElementException as e:
                print('Error:waitforDisplay, NoSuchElementException, xpath = %s\n' % xpath)
    
    def elementIsDisplayed(xpath):
        try:
            driver.find_element_by_xpath(xpath)
        except NoSuchElementException as e:
            return False
    
    def getText(xpath):
        time.sleep(1)
        return driver.find_element_by_xpath(xpath).text
    
    if __name__ == '__main__':
        openDriver()
        login('admin')
        #data = {'pwdNew'='admin', 'pwdOld'='12345678'}
        #changeUserPwd_main(data)
        #9. 进行单元测试并生成测试报告
        unittest.main(testRunner=HtmlTestRunner.HTMLTestRunner(output='test_report',report_title='修改管理员密码试报告'))
        closeDriver()
    
    展开全文
  • AutoIT自动化脚本工具与脚本录制 带帮助文档,入门教程,和API使用示例!
  • QQ游戏连连看自动化脚本(仅限学习交流) 最近看到了一份连连看的自动化脚本,对其中的图像识别挺感兴趣就研究了一番 ```python import random import time import cv2 import numpy as np import win32api...

    QQ游戏连连看自动化脚本(仅限学习交流)

    最近看到了一份连连看的自动化脚本,对其中的图像识别挺感兴趣就研究了一番

    import random
    import time
    import cv2
    import numpy as np
    import win32api
    import win32con
    import win32gui
    from PIL import ImageGrab
    
    from ImageSimilarityDegree import classify_gray_hist
    
    # x轴 块数量
    x_num = 19
    # y轴 块数量
    y_num = 11
    im
    展开全文
  • Python自动化脚本登录校园网

    千次阅读 热门讨论 2021-06-14 23:31:24
    Python自动化脚本登录校园网 所需工具:python编译环境(博主使用的pycharm作演示,其实在cmd也可以操作!) selenium自动化脚本 .bat批处理文件 第一步,通过pycharm创建一个项目 点击左上角file,然后new project 2...

    Python自动化脚本登录校园网

    所需工具:python编译环境(博主使用的pycharm作演示,其实在cmd也可以操作!)
    selenium自动化脚本
    .bat批处理文件
    第一步,通过pycharm创建一个项目
    点击左上角file,然后new project
    在这里插入图片描述
    2.创建项目
    在这里插入图片描述
    3.然后右键项目名创建py文件
    在这里插入图片描述
    4.在pycharm中调用cmd,(在左下角的terminal就是了),再通过cd命令进入到Scripts文件下,Scripts是自己的python编译器文件夹下的目录
    在这里插入图片描述
    在这里插入图片描述

    5.下载selenium,指令为: pip install selenium
    在这里插入图片描述
    这里博主下过了,就不再演示了。
    6.我们输入校园网网址,打开元素定位界面,进入pycharm编写代码

    from selenium import webdriver
    import time
    from selenium.webdriver.support.select import Select
    driver=webdriver.Chrome()
    //这里参数为你校园网登录地址
    driver.get("http://**********.htm?isReback=1")
    time.sleep(1)
    //这个是选择移动联通或者电信的下拉框,如果没有下拉框可以选择无视跳过以下四行代码
    el=driver.find_element_by_xpath("//select[@name='ISP_select']")
    time.sleep(1)
    Select(el).select_by_visible_text("中国移动")
    time.sleep(1)
    //这里我们通过元素定位找到输入账号的标签根据你学校的来修改[@]里的内容
    driver.find_element_by_xpath("//input[@type='text']").send_keys("此处为你的学号")
    time.sleep(1)
    //同理上面,定位到密码标签修改[@]里的内容
    driver.find_element_by_xpath("//input[@type='password']").send_keys("你的密码")
    time.sleep(1)
    //这里需要定位你们的登录按钮,找到元素同理修改[@]里的内容
    driver.find_element_by_xpath("//input[@type='submit']").click()
    time.sleep(6)
    driver.quit()
    

    创建.bat文件,通过记事本打开 写入 python D:???\自动登录校园网.py,此处为你这个py所在的绝对路径。

    把这个.bat文件放进C:\Users\玛卡巴卡\AppData\Roaming\Microsoft\Windows\Start
    Menu\Programs\Startup文件夹下 那个玛卡巴卡根据自己的电脑用户名写!! 完成后就可以开机自启!!

    展开全文
  • 自动化脚本——java

    千次阅读 2019-01-30 14:41:31
    自动化脚本 本文将介绍一个Java+TestNG+Maven+Selenium的web自动化测试脚本环境下selenium简单线性脚本的编写,并提供全部代码。 文中将看到,使用selenium编写一个能操作浏览器的脚本是非常容易的。而简单线性脚本...

    自动化脚本
    本文将介绍一个Java+TestNG+Maven+Selenium的web自动化测试脚本环境下selenium简单线性脚本的编写,并提供全部代码。

    文中将看到,使用selenium编写一个能操作浏览器的脚本是非常容易的。而简单线性脚本的编写是下一步编写页面对象脚本的基础。

    1.在开始之前,我想明确一下,自动化测试的基本原理。

    有的测试人员认为自动化测试很神秘,很神奇。恰恰相反, 自动化测试很简单 。

    自动化测试,一般分三个步骤:

    1)取预期结果;

    2)取实际结果;

    3)断言:比较1)和2)来判断测试是否通过;

    从历史角度来看,自动化测试的出现早于专职测试人员的出现。也就是说在开始有我们这些专门做软件测试的测试人员之前,自动化测试已经存在了。

    原因就是他 简单 。

    selenium自动化测试,在自动化测试里也是属于超级 简单 的一类。但前提是必须理解上面说的自动化测试原理,以及其他一些自动化测试设计原则。否则,我们将会看到, 简单的项目也会失败 。有很多由初、中级开发人员或会一点点代码的测试人员编写的selenium自动化测试项目,因此失败。

    2.简单的selenium测试脚本编写,一般也是分三个步骤:

    1)定位一个元素

    2)操作一个元素

    3)断言

    好,这里用百度首页的搜索做一个例子:

    ‘’'java
    1 package simplewebtest.test;
    2
    3 import java.util.concurrent.TimeUnit;
    4
    5 import org.openqa.selenium.By;
    6 import org.openqa.selenium.WebDriver;
    7 import org.openqa.selenium.firefox.FirefoxDriver;
    8 import org.testng.annotations.Test;
    9
    10 public class TestBaiduHome {
    11
    12 @Test
    13 public void searchSomething(){
    14
    15 WebDriver driver=new FirefoxDriver();//打开Firefox; open firefox
    16 driver.get(“http://www.baidu.com”);//打开百度open the url
    17 driver.findElement(By.id(“kw1”)).sendKeys(“GitHub”);//输入搜索关键字“GitHub";input search keyword
    18 driver.findElement(By.id(“su1”)).click();//点击搜索按钮click the search button
    19 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);//等页面加载,10秒内不加载成功即报超时。waiting for 10 seconds
    20 String aResult=driver.findElement(By.xpath(".//[@id=‘4’]/h3/a")).getText();//取第四条搜索结果的标题。 get the text of 4th search result
    21 assert aResult.contains(“GitHub”);//做断言 assertion
    22 driver.findElement(By.xpath(".//
    [@id=‘4’]/h3/a")).click();//打开第四个搜索结果。Open the 4th search result on baidu
    23 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);//等页面加载,10秒内不加载成功即报超时。waiting for 10 seconds
    24
    25 //获取所有窗口的handle,然后逐个切换,直到切换到最新窗口 switch to the new window
    26 for(String winHandle : driver.getWindowHandles()){
    27 driver.switchTo().window(winHandle);
    28 }
    29
    30 String aTitle=driver.getTitle();//取新窗口的title
    31 System.out.println(“current widnow title is:”+aTitle);//打出来看看
    32 assert aTitle.contains(“GitHub”);//断言
    33
    34 }
    35 }

    ‘’’
    View Code
    本系列所有代码https://github.com/zhangting85/simpleWebtest,

    这个例子存放在src/test/java/simplewebtest/test/TestBaiduHome.java

    下面逐行解释:

    WebDriver driver=new FirefoxDriver();
    这里是声明了一个 WebDriver 类型的对象引用,我给他起名叫driver;

    然后让这个driver指向WebDriver的一个子类(FirefoxDriver)的对象;

    我们知道FirefoxDriver继承自WebDriver,IEDriver也继承自WebDriver;

    就像苹果继承自水果,橘子也继承自水果;

    这里用了Java的向上转型,使用子类的对象来初始化父类的引用。(注:实际上Webdriver是一个接口。)

    这将产生什么效果呢?

    我们在driver上调用方法的时候,都是先查找WebDriver里的方法定义,然后jvm去他的子类比如FirfoxDriver中找到其在子类中的实现,再执行的。比如FirefoxDriver的get方法和IEDriver的get方法,他们具体执行的代码内容明显是不一样的。但我们的脚本,只要改变driver引用的子类,而不用改变我后面的方法调用。

    也就是说,我们用firefox和用ie,除了第一句话新建对象时不一样,后面的方法调用都是一样的。

    java会自动根据我们上面这句话里创建的对象,去选择他应该执行的实际代码。

    这也就是JAVA里的多态,一句话记住多态:用子类对象初始化父类引用,方法调用时自动执行子类代码,成员变量调用时自动调用父类成员变量。

    以上,题外话略多,是希望测试人员不要自我放弃,写个程序不会有多难,Java的基础必须要掌握。

    driver.get(“http://www.baidu.com”);
    调用Webdriver的get方法,跳转到制定的URL;

    凡是这里跳转不过去的,十有八九是因为webdriver版本太低,浏览器版本太高,请改上一节讲的pom.xml里配置的webdriver版本号至最新版。

    driver.findElement(By.id(“kw1”)).sendKeys(“GitHub”);//输入搜索关键字“GitHub";input search keyword
    driver.findElement(By.id(“su1”)).click();//点击搜索按钮click the search button
    这里调用Webdriver的findElement方法来查找页面元素。然后在找到的页面元素WebElement对象上调用sendKeys方法来打字和click方法来点击。

    如果你问我这个id的值是怎么来的,那么你可以去看一下FireBug这个插件,他会替你找到每一个元素的一切属性。

    如果你要定位的元素没有id,你还可以用className,Xpath,css,等等来定位。

    另一个插件FirePath可以帮你产生任意元素的xpath表达式。

    findElement方法需要一个By类型的参数。

    但是代码里我们使用了By.id(“kw1”) 这里的id是一个静态方法,他的声明是:

    public static By id(java.lang.String id)

    所以我们调用By.id的时候,他会返回一个By类型的对象给我们。

    至于下面findElement是怎样用这个对象来查找页面元素的,暂时不讲。简单来说,就是把我们传入的id传给对应的Driver,由driver去查找元素,再返回给我们。

    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    很常用的一个等待页面加载的语句。这个implicityWait是会对driver的下一个findElement调用起作用的。

    百度这个搜索结果页面很有意思,虽然我们感觉不出来,但搜索结果其实是异步显示上去的,所以不加等待他就会找不到元素。

    而后面点击搜索结果打开一个窗口的时候我们再次用了等待。

    另外,这个方法并不是对所有网页都有效,有时我们要用一些别的等待。还有尽量不要用Thread.sleep

    String aResult=driver.findElement(By.xpath(".//*[@id=‘4’]/h3/a")).getText();//取第四条搜索结果的标题。 get the text of 4th search result
    assert aResult.contains(“GitHub”);//做断言 assertion
    这两句,首先去取实际结果,也就是根据某个xpath表达式找到的搜索结果元素上的Text

    然后,再判断他是否符合预期结果,即包含有“GitHub”这个字符串。

    assert是TestNG提供的,这里不要用if else去判断这个字符串。TestNG的assert结果会反映在测试报告里。

    也不要自己去抛出一个代表断言失败的异常,TestNG会替你完成这件事。

    以上两个错误是中低级开发人员编写测试框架时常犯的。

    我们既然用了TestNG,请至少尝试去用TestNG的功能。

    for(String winHandle : driver.getWindowHandles()){
    driver.switchTo().window(winHandle);
    }
    这段代码表示切换窗口。有意思的是,他是在窗口打开后,先取出所有窗口的hanles,然后一个一个切过去。

    因为新窗口必定在最后,所以不论你有几个窗口,这段代码总能找到最新一个窗口。如果你还需要操作老窗口,

    可以事先把老窗口的Handle保存起来,以后再切回来。

    以上一个简单的线性测试脚本编写完毕。基本的元素定位、元素操作、窗口切换、断言都有了,你可以查看官网的文档,了解各个api的更多方法。

    熟练地编写线性脚本大概需要个把月,有编程基础的更快,这一篇介绍的内容基本没有难度。下一篇介绍进阶的线性脚本,包括frame,actions,关闭浏览器,运行javascript,WebDriverWait。

    展开全文
  • 最简单的自动化脚本

    千次阅读 2019-02-19 17:24:41
    最简单的自动化脚本
  • Nessus中文报告自动化脚本

    千次阅读 2019-03-13 15:33:00
    Nessus中文报告自动化脚本 前言 Nessus扫描完成,总要花挺多时间去整理报告,为此写了一个小脚本,用于自动化生成中文漏洞报告。 解析导出的html报告,自动翻译成中文,并提供修复建议,减少整理...
  • Python自动化脚本 for循环+数字拼接

    千次阅读 2019-01-28 11:35:38
    Python自动化脚本 for循环+数字拼接 在写Python自动化脚本时,在执行多个重复操作时遇到的,需将字符串和数字进行拼接,使用for循环,进行操作。
  • secureCRT自动化脚本

    千次阅读 2012-10-15 18:45:21
    有时候需要每天定时拉取服务器上的日志...下面详细介绍下利用secureCRT 设置自动化脚本的方法: 1.首先设置你要在linux机器上执行的脚本: 方法一:自己编写 方法二:secureCRT录制脚本功能(简单方便,不易出错)...
  • jmeter 接口自动化脚本,案例。获取天气,读取Excel数据并动态设置为变量。
  • 在上节课我们演示了安卓手机投屏的基本参数设置操纵,本科我们演示安卓群控命令封装调用。 511遇见安卓手机投屏基本设置演示 ...为了群控方便,511遇见封装了常用的ADB自动化脚本。 采用了中文的命令! 只有AD
  • Xshell设置运行自动化脚本

    千次阅读 2019-06-17 10:06:00
    使用Xshell工具连接操作Linux系统,并编写运行自动化脚本示例: 这里介绍一种自动化下载日志文件的例子,下面先贴上编写的脚本,这里脚本命名为cyp-assout-log.js如下: /* xshell调用自动化js脚本 */ /* ...
  • 自动化脚本之关键字驱动脚本

    千次阅读 2017-10-25 14:51:59
    第48贴:自动化脚本之关键字驱动脚本 关键字驱动实际上是比较复杂的数据驱动技术的逻辑扩展。将数据文件变成测试用例的描述,用一系列关键字指定要执行的任务。在关键字驱动技术中,假设测试者具有某些被测系统的...
  • 实现闲鱼自动化脚本-方案对比分析

    千次阅读 2020-10-27 13:38:29
    简介:用自动化脚本代替流程化的操作 原则:只提供替代人工的技术支持,不参与具体使用场景 具体功能: 关键词检索 按要素排序 按条件筛选 自动发问候语 自动下单 拍下通知 每日报表汇总 联系方式:QQ-...
  • 点击上方“AirPython”,选择“置顶公众号”第一时间获取 Python 技术干货!阅读文本大概需要 6 分钟。之前有读者朋友说 Airtest 官方支持将自动化脚本编译成 APK ...
  • jenkins上配置robotframeworkride自动化脚本任务 编写好的自动化脚本,集成在jenkins上进行自动运行于监控,这里采用分布式构建,在一台slave上进行任务构建与自动化脚本的运行。 步骤: 1、创建jenkins任务 选择...
  • 自动化脚本编写实例

    万次阅读 2018-02-07 14:39:56
    自动化脚本编写实例 打开浏览器访问pto登陆修改管理员密码单元测试数据检查输入的数据合法性获取输入错误数据之后的页面提示语编写测试用例编写单元测试类 1 单元测试中的通用操作2 测试类 进行...
  • 第一个python自动化脚本

    万次阅读 2019-01-29 14:26:12
    第一个python自动化脚本-测试页面pageid # -*- coding : utf-8 -*-__authon__ = 'test'import requestsimport xlrdfrom pyquery import PyQuery as pqfrom xlutils3 import copyimport osimport timefrom ...
  • 自动化脚本的录制与回放 1.实验所需插件:Katalon Automation Recorder Katalon Automation Recorder 的开发为那些无法再用 Selenium IDE 来记录和重放自动化测试的用户们,或者是为正在使用开源框架,寻求一个...
  • 自动化脚本执行失败原因分析

    千次阅读 2015-12-22 10:07:29
    自动化脚本在执行完毕后,每个用例会分为通过或失败两种。对通过的用例,没什么可说的,这里主要谈下失败的用例。 失败的用例需要人去查看是否是脚本稳定性的问题,或是程序更新引起的问题。 对于脚本稳定...
  • postman接口自动化脚本编写实例 postman我想大家都很熟悉,有些小伙伴说请求不通,我想可能是设置里面ssl certificate verification的问题 1.下面可以看我们的实例了 我们先请求一个login的登录接口,用户名...
  • Java+Selenium编写自动化脚本

    千次阅读 2020-01-04 16:48:16
    package ... import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; ... * java编写自动化脚本 * @author Administrator * */ pu...
  • firefox IDE录制web自动化脚本

    千次阅读 2017-03-25 19:58:43
    firefox IDE录制自动化脚本,录制完成后可以保存为java,c#, python, ruby等语言支持的代码,复制粘贴就能用,最好简单修改一下,增加脚本的健壮性,太邪乎了! 简单介绍一下安装步骤吧; 下载firefox浏览器  ...
  • java+selenium自动化脚本编写

    千次阅读 2019-06-04 19:13:00
    实训项目:创盟后台管理,页面自动化脚本编写 使用工具:java+selenium 1)java+selenium环境搭建文档 2)创盟项目后台管理系统链接 java+selenium环境搭建 一、Selenium介绍 Selenium 主要用于Web 应用程序的...
  • 本已收会围绕整个开发过程,从配置和规划到自动化测试和创建不同的命令行工具。本书涵盖了基础脚本到标准库Python包使用都所有常用知识。通过本书的学习,你将了解如何基于理想的资源规划、实施和发...
  • UIRecorder录制android APP自动化脚本

    千次阅读 2018-07-05 10:58:37
    UIRecorder号称是一款零成本的UI自动化录制工具在git上有详细的介绍:https://github.com/alibaba/uirecorder/blob/master/README_zh-cn.md他支持 android ios 和pc端的自动化脚本录制在支持无线native app(Android,...
  • nosetests自动化脚本调试

    千次阅读 2014-01-10 14:57:21
    nosetests是python自动化脚本测试框架,自带了方便的debug。 命令行参数 nosetests --pdb -s xxx 无须设置断点,只要FAIL/ERROR就会进入调试模式。 设置断点 from nose.tools import set_trace; ... ...
  • 编写第一个自动化脚本

    千次阅读 2018-12-25 20:07:09
        1)#coding=utf-8 防止乱码问题 2)from selenium import ...导入selenium的webdriver包,只有导入才能使用WebDriver API进行自动化脚本开发。在Python下面,通过from import或import引入模块 3)d  ...
  • 自动化脚本自动生成技术探讨

    千次阅读 2015-08-12 20:51:46
    自动化脚本自动生成技术探讨 大家可能刚用学Selenium 时一定接触过IDE ,也就是录制之后回放如果没 有问題我们就将脚本导出,在这中间大家有没有想到过为什么IDE 工具就能自动生成脚本呢   其实要实现类似的...
  • [Author]: kwu 每日定时导入hive数据仓库的自动化脚本

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 603,314
精华内容 241,325
关键字:

自动化脚本