自动化测试学习笔记XD

文章目录

自动化测试学习笔记

1、元素查找(实训1-9)

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get('http://10.1.30.75/pams/front/login.do')
driver.implicitly_wait(10)

driver.find_element_by_id('loginName').send_keys('id')
# id定位
driver.find_element_by_name('loginName').send_keys('name')
# name定位
driver.find_element_by_xpath('//*[@id="loginName"]').send_keys('xpath')
# xpath定位
driver.find_element_by_css_selector('#loginName').send_keys('css')
# css选择器定位
driver.find_elements_by_class_name('form-control')[1].send_keys('class_name')
# 复数元素定位
driver.find_element_by_tag_name('button').click()
# 标签名定位
time.sleep(2)
driver.quit()

2、鼠标操作(实训10)

1.导入包

from selenium.webdriver import ActionChains
from selenium import webdriver
import time

2.基本用法

当调用ActionChains的方法时,不会立即执行,而是会将所有的操作按顺序存放在一个队列里,当你调用perform()方法时,按照队列里面的顺序进行执行。其中调用的perform()方法必须放在ActionChains方法最后。

3.方法列表

  • click(on_element=None) ——单击鼠标左键

  • click_and_hold(on_element=None) ——点击鼠标左键,不松开

  • context_click(on_element=None) ——点击鼠标右键

  • double_click(on_element=None) ——双击鼠标左键

  • drag_and_drop(source, target) ——拖拽到某个元素然后松开

  • drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某 个坐标然后松开

  • key_down(value, element=None) ——按下某个键盘上的键

  • key_up(value, element=None) ——松开某个键

  • move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标

  • move_to_element(to_element) ——鼠标移动到某个元素

  • move_to_element_with_offset(to_element, xoffset, yoffset) — —移动到距某个元素(左上角坐标)多少距离的位置

  • perform() ——执行链中的所有动作

  • release(on_element=None) ——在某个元素位置松开鼠标左键

  • send_keys(*keys_to_send) ——发送某个键到当前焦点的元素

  • send_keys_to_element(element, *keys_to_send) ——发送某个键到 指定元素

4.调用方法

driver = webdriver.Chrome()
driver.get('http://10.1.30.75/pams/front/login.do')
driver.implicitly_wait('10')

a = driver.find_element_by_id('loginName')
b = driver.find_element_by_id('password')

a.send_keys('student')
b.send_keys('student')
a.分布写法
'''分布写法'''
action = ActionChains(driver)

action.double_click(a).perform()
time.sleep(1)
action.context_click(a).perform()
time.sleep(1)
action.double_click(b).perform()
b.链式写法
'''链式写法'''
ActionChains(driver).double_click(a).context_click(a).double_click(b).perform()

5.注意

  • Selenium的Action有不支持HTML5的拖拽的问题

3、键盘操作(实训11)

1.导入包

from selenium.webdriver.common.keys import Keys
from selenium import webdriver
import time

2.基本用法

  • 先使用ActionChains类将鼠标移动到需要进行键盘操作的位置,然后进行键盘操作。

  • 先通过元素定位方式进行元素定位,然后通过send_keys()进行键盘操作。

3.方法列表

回车键 Keys.ENTER
删除键 Keys.BACK_SPACE
空格键 Keys.SPACE
TAB键 Keys.TAB
回退键 Keys.ESCAPE
刷新键 Keys.F5
Shift键 Keys.SHIFT
ECS键 Keys.ESCAPE
上键 Keys.ARROW_UP
下键 Keys.ARROW_DOWN
左键 Keys.ARROW_LEFT
右键 Keys.ARROW_RIGHT
'='键 EQUALS
全选(Ctrl+A) Keys.CONTROL,'a'
复制(Ctrl+C) Keys.CONTROL,'c'
剪切(Ctrl+X) Keys.CONTROL,'x'
粘贴(Ctrl+V) Keys.CONTROL,'v'

4.调用方法

from selenium.webdriver.common.keys import Keys
from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get('http://10.1.30.6/pams/front/login.do')
driver.implicitly_wait(10)

driver.find_element_by_id('loginName').send_keys('student')
driver.find_element_by_id('password').send_keys('student')
driver.find_element_by_tag_name('button').click()
# 登陆成功

driver.find_element_by_link_text('供应商').click()
driver.find_element_by_name('title').send_keys('信息')
time.sleep(1)
driver.find_element_by_name('title').send_keys(Keys.CONTROL,'a')
driver.find_element_by_name('title').send_keys(Keys.CONTROL,'c')
driver.find_element_by_name('title').send_keys(Keys.CONTROL,'v')
driver.find_element_by_name('title').send_keys(Keys.CONTROL,'v')

time.sleep(2)
driver.quit()

4、时间等待(实训12)

1.显式等待WebDriverWaits()

​ 显式等待指等待页面加载完成,找到某个条件发生后再继续执行后续代码,如果超过设置时间检测不到则抛出异常。

使用WebDriverWait首先需要导入此模块。代码如下:

from selenium.webdriver.support.ui import WebDriverWait

使用格式:

WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

driver:WebDriver的驱动程序(Ie、Firefox、Chrome)。

timeout:最长超时时间,默认以秒为单位。

poll_frequency:休眠时间的间隔(步长)时间,默认为 0.5 秒。

ignored_exceptions:超时后的异常信息,默认情况下抛NoSuchElementException 异常。

例如:

element=WebDriverWait(driver,10).until(lambda x: x.find_element_by_id(“someId”))

is_disappeared=WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).until_not(lambda x: x.find_element_by_id(“someId”).is_displayed())

注意:until是固定格式,可以理解为直到元素定位到为止,lambda x:x是一个匿名函数构建的方法,这里不太好理解,可以理解为固定格式,最后接定位方法。

说明:

WebDriverWai()一般由 unit()或 until_not()方法配合使用。

until(method, message=’’)调用该方法提供的驱动程序作为一个参数,直到返回值不为 False。

until_not(method, message=’’)调用该方法提供的驱动程序作为一个参数,直到返回值为 False。

2.强制等待time.sleep()

​ 设置等待最简单的方法就是强制等待,其实就是time.sleep()方法,不管它什么情况,让程序暂停运行一定时间,时间过后继续运行。缺点是不智能,设置的时间太短,元素还没有加载出来,那照样会报错。设置的时间太长,则会浪费时间,不要小瞧每次几秒的时间,case多了,代码量大了,很多个几秒就会影响整体的运行速度了,所以尽量少用这个。

3.隐性等待 implicitly_wait()

​ 隐性的等待就是我们设置了一个等待时间范围,这个等待的时间是不固定的,最长的等待也莫过于我们设置的最大值。

隐性等待,也叫智能等待,是selenium提供的一个超时等待。等待一个元素被发现,或一个命令完成。如果超出了设置时间的则抛出异常。

5、窗口切换(实训13)

1.主要方法

(1)获取第一个窗口的名字
print(driver.current_window_handle)
(2)获取所有窗口的名字
print(driver.window_handles)
(3)获取到第二个窗口的名字
print(driver.window_handles[1])
(4)※ 进行窗口切换
driver.swtich_to.window(driver.window_handles[1])
(5)关闭浏览器当前窗口
driver.close()

2.基本用法

from selenium import webdriver
import time

d = webdriver.Chrome()
d.get('http://10.1.30.75/ams/front/login.do')
d.implicitly_wait(10)


d.find_element_by_id('taskId').send_keys('2')
# 输入ID
print('第一个窗口名字:',d.current_window_handle)

d.find_element_by_class_name('font-blue.right').click()
print('第二个窗口名字:',d.current_window_handle)
# # 此时窗口名字还是第一个窗口,故需要切换
d.switch_to_window(d.window_handles[1])
# switch_to_window方法已过期,使用switch_to.window方法来代替

print('所有窗口名字',d.window_handles)
# 所有窗口名字
print('第二个窗口名字:',d.current_window_handle)
# 成功切换

d.close()
# 关闭当前窗口
# d.find_element_by_id('taskId').send_keys('2')
# 报错 因为上个窗口即使已被关闭,也要将窗口切换至当前窗口,才能操作当前窗口的元素
d.switch_to.window(d.window_handles[0])
# 切换至当前窗口
print('当前窗口:',d.current_window_handle)
d.find_element_by_id('taskId').send_keys('2')
# 操作成功

time.sleep(2)
d.quit()
# 关闭浏览器

3.注意

  • ​ 上个窗口即使已被关闭,也要将窗口切换至当前窗口,才能操作当前窗口的元素
  • ​ switch_to_window方法已过期,使用switch_to.window方法来代替

6、页面属性删除(14)

1.主要步骤

(1)用Selenium定位“目标”链接。

​ login_link=driver.find_element_by_XX(“目标”)

(2)删除已找到的页面元素的target属性。

​ driver.execute_script(“arguments[0].removeAttribute(‘target’)”,login_link)其中arguments[0]的意思就是去字符串后面的第一个参数login_link的真正的值。

(3)点击删除target属性后的这个页面元素。

​ login_link.click()

2.基本用法

from selenium import webdriver
import time

d = webdriver.Chrome()
d.get('http://www.baidu.com')
d.implicitly_wait(10)


b = d.find_elements_by_class_name('mnav.c-font-normal.c-color-t')[0]
# 定位元素

# b.click() # 弹出新窗口
d.execute_script("arguments[0].removeAttribute('target')",b)
b.click()
# 不弹出新窗口,覆盖旧窗口

time.sleep(2)
d.quit()
# 关闭浏览器

7、submit(15)

​ 在html中,关于form表单的部分,其中按钮类型就有button与submit,简单的来理解,button就是一个单纯的点击,submit就不是单纯的单击,它会涉及到前后台的交互,在Selenium自动化测试中,点击使用的方法就是click(),同时有另外一个方法为submit(),click()方法就是单纯的点击下,但是submit()方法一般使用在有form标签的表单中

8、下拉滚动条(16)

主要方法

ActionChains(d).send_keys(Keys.ARROW_DOWN).send_keys(Keys.ARROW_DOWN).perform()
# 1.通过ActionChains,Keys方法连续按方向箭头

d.execute_script("window.scrollTo(0,3000)")
# 2.用javascript知识中的语句实现滚动条移动,代码中的(0,0)代表页面横向和纵向的坐标。

9、下拉框处理(17)

1.主要方法

​ (1)使用Select模块的方法

​ (2)使用选项元素标签定位。

​ (3)直接通过x path层级标签定位。

2.主要步骤
基本流程
from selenium.webdriver.support.select import Select
from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get('http://10.1.30.75/pams/front/login.do')
driver.implicitly_wait(10)

driver.find_element_by_id('loginName').send_keys('student')
driver.find_element_by_id('password').send_keys('student')
driver.find_element_by_tag_name('button').click()

driver.find_element_by_link_text('供应商').click()

方法一:使用Select模块的方法

​ (需导包:from selenium.webdriver.support.select import Select)

select = driver.find_element_by_name('providerTypeId')
# 定位下拉框
Select(select).select_by_visible_text('其他')
方法二:使用选项元素标签定位
driver.find_elements_by_tag_name('option')[7].click()
方法三:直接通过xpath层级标签定位
driver.find_element_by_xpath('//*[@id="fmsearch"]/div/div[2]/select/option[5]').click()

10、文件上传处理(18)

1.主要步骤

​ 只要定位上传按钮,找到input标签属性,通过send_keys添加本地文件路径就可以了。

2.基本用法

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get('http://10.1.30.75/pams/front/login.do')
driver.implicitly_wait(10)

driver.find_element_by_id('loginName').send_keys('student')
driver.find_element_by_id('password').send_keys('student')
driver.find_element_by_tag_name('button').click()

driver.find_element_by_link_text('资产入库').click()

driver.find_element_by_xpath('//*[@id="content"]/div[2]/div/div/table/tbody/tr[1]/td[11]/a').click()

driver.find_element_by_name('file').send_keys('F:/test.png')
time.sleep(1)
driver.find_element_by_id('submitButton').click()
# 提交成功

time.sleep(2)
# driver.quit()

3.注意

(1)要将复制的文件路径中的反斜线变成正斜线,可以使用3种方法

​ a. 在字符串中用两个反斜线表示一个正斜线。

​ b. 在字符串前面加一个字母r,表示将所有的反斜线变为正斜线。

​ c. 把字符串中所有的反斜线改成正斜线。

(2)路径不要有中文

11、页面截图处理(19)

1.主要方法

​ get_screenshot_as_file(self, filename)

2.主要步骤

driver.get_screenshot_as_file("F:/denglu.png")

12、alert弹出框处理(20)

1.主要方法

​ (1)获取对话框文本值

​ d.switch_to.alert.text

​ (2)相当于点击”确认“

​ d.switch_to.alert.accept()

​ (3)相当于点击”取消“

​ d.switch_to.alert.dismiss()

​ (4)输入值,这个alert和confirm没有输入对话框,所以这里不能用,只能用于prompt,否则会报错

​ d.switch_to.alert.sendkeys()

13、python方法介绍(21)

1.基本形式

​ def 方法名(参数)。

​ 注意:执行语句方法名为调用的表示名,参数则是传入的参数,可以根据需要定义,也可以没有。

2.简单规则

​ 方法体中的语句都要比方法声明缩进4 个空格。方法只有被调用才会被执行,否则不执行方法里面的脚本。

3.实例

def read():
    from selenium import webdriver
    driver = webdriver.Chrome()
    driver.implicitly_wait(10)
    driver.get("http://10.1.30.75/pams/front/login.do")
    # 进入到资产管理系统登录页面
    driver.find_element_by_id('loginName').send_keys("student")
    # 输入用户名
    driver.find_element_by_id('password').send_keys("student")
    # 输入密码
    driver.find_element_by_tag_name('button').click()
    # 点击登录按钮
if __name__ == '__main__':
    read()
    #方法调用

14、unittest测试框架(22)

1.导包

import unittest # 导入测试框架

2.框架使用说明

  • ​ 定义一个继承自等的测试用例类。

  • 定义**setUp()**方法、**tearDown()**方法、**setUpClass()**方法、**tearDownClass()方法,其中setUp()**方法指在每个测试用例方法执行前,都会执行一次;**tearDown()**方法指在每次测试用例方法执行结束,都会执行一次;**setUpClass()**方法指在一个测试用例集执行前只执行一次;**tearDownClass()**方法指在一个测试用例集执行后只执行一次。

  • 定义测试用例,名字以test开头。

  • 一个测试用例应该只测试一个方面,测试目的和测试内容应很明确。主要调用assertEqualassertRaises断言方法判断程序执行结果和预期值是否相符。

  • 调用**unittest.main()**启动测试。

3.1案例一

import unittest
from selenium import webdriver
import time

'''案例一
案例步骤:
1、分别定义4个方法setUp()、tearDown()、test_denglu()、test_denglu1();
2、setUp()方法启动浏览器;
3、tearDown()方法关闭浏览器;
4、test_denglu()方法进入资产管理系统登录页面,输入账号和密码,点击登录按钮;
5、test_denglu1()方法进入资产管理系统登录页面,输入账号和密码,点击登录按钮,在资产管理系统页面点击个人信息按钮。
'''

# 定义一个继承自unittest.TestCase的测试用例类。
class Denglu(unittest.TestCase):
    def setUp(self):
        self.d = webdriver.Chrome()
        self.d.implicitly_wait(10)
        self.d.get('http://10.1.30.75/pams/front/login.do')

    def test_denglu(self):
        d = self.d
        d.find_element_by_id('loginName').send_keys('student')
        d.find_element_by_id('password').send_keys('student')
        d.find_element_by_tag_name('button').click()

    def test_denglu1(self):
        d = self.d
        d.find_element_by_id('loginName').send_keys('student')
        d.find_element_by_id('password').send_keys('student')
        d.find_element_by_tag_name('button').click()
        d.find_element_by_link_text('个人信息')

    def tearDown(self):
        time.sleep(0.5)
        self.d.quit()

if __name__ == '__main__':
    unittest.main()

3.2案例二


'''案例二
案例步骤:
1、分别定义4个方法setUpClass()、tearDownClass()、test_denglu()、test_denglu1();
2、setUpClass()方法启动浏览器;
3、tearDownClass()方法关闭浏览器;
4、test_denglu()方法进入资产管理系统登录页面,输入账号和密码,点击登录按钮;
5、test_denglu1()方法进入资产管理系统页面,在资产管理系统页面点击个人信息按钮。
'''

# 定义一个继承自unittest.TestCase的测试用例类。
class Denglu(unittest.TestCase):
    @classmethod
    def setUpClass(cls):    # 定义setUPClass方法
        cls.d = webdriver.Chrome()
        cls.d.implicitly_wait(10)

    @classmethod
    def tearDownClass(cls):      # 定义tearDownClass方法
        time.sleep(0.5)
        cls.d.quit()

    def test_denglu(cls):   # 定义test_denglu方法
        d = cls.d
        d.get('http://10.1.30.75/pams/front/login.do')
        d.find_element_by_id('loginName').send_keys('student')
        d.find_element_by_id('password').send_keys('student')
        d.find_element_by_tag_name('button').click()
        # 登陆成功
        d.find_element_by_link_text('部门管理').click()
        time.sleep(0.5)

    def test_denglu1(cls):
        cls.d.find_element_by_link_text('个人信息').click()
        # 点击个人信息按钮
        time.sleep(0.5)

if __name__ == '__main__':
    unittest.main()
    # 调用unittest.main()启动测试

15、csv文件读取(23)

1.读取步骤

​ 1、导入csv代码库;

​ 2、以只读形式打开文件;

​ 3、由于打开文件的数据不能够直接查看,所以要将打开文件的数据进行格式转换;

​ 4、使用for循环将所有的数据进行打印,但是不包括第一行标题数据。

2.案例

'''案例描述
在自己的电脑新建一个csv文件,
文件里面存在数据,然后通过代码进行读取,
读取的时候去除第一行的标题数据。'''

import csv  # 导入csv代码库

def read(): # 将数据读取存在一个方法中,方便后面被调用
    path = r"D:\JetBrains\rczidonghua\zdhcs.csv"
    stream = open(path,'r')
    # 以只读的形式打开文件
    data = csv.reader(stream)
    # 进行数据格式转换
    list = []   # 将读取的数据存放到list中
    i = 0
    for row in data:
        if i != 0 :
            list.append(row)
        i = i + 1
    return list

if __name__ == '__main__':
    data = read()
    for row in data:
        print(row)

16、数据驱动(24)

1.数据驱动步骤

​ (1)、首先在头部导入ddt代码库,import ddt;

​ (2)、在测试类前添加一个装饰器,表示这个类采用ddt代码库的方式实现数据驱动(@ddt.ddt);

​ (3)、在测试方法前使用@ddt.data()指定数据来源。

2.代码编写思路

​ 先将测试数据单独存在,然后再编写脚本的时候调用存放的数据,逐条进行数据的读取

3.案例

readxnr.py
'''案例步骤:
1、进入资产管理系统登录页面;
2、输入任务ID、用户名和密码,点击登录按钮;
3、点击供应商按钮;
4、在供应商页面中的供应商名称输入框中输入多组数据进行查询。
'''

import csv

def readxnr():
    stream = open(r"D:\JetBrains\rczidonghua\shujuqudong.csv",'r')
    data = csv.reader(stream)
    list=[]
    i=0
    for row in data:
        if i != 0:
            list.append(row)
        i = i+1
    return list

# if __name__ == '__main__':
#     data = readxnr()
#     for row in data:
#         print(row)
Pxnr.py
import unittest
import ddt
import time
from selenium import webdriver
from shiXun_Test.shujuqudong.readxnr import readxnr

@ddt.ddt
# ddt装饰器
class Pxnr(unittest.TestCase):
    def setUp(self):
        self.d = webdriver.Chrome()
        self.d.implicitly_wait(10)

    def tearDown(self):
        time.sleep(1)
        self.d.quit()

    stream_info = readxnr()
    # 创建一个变量来接收数据
    @ddt.data(*stream_info)
    def test_pxnr(self,list):
        d = self.d
        d.get("http://10.1.30.75/pams/front/login.do")
        # 进入到资产管理系统登录页面
        d.find_element_by_name('loginName').send_keys("student")
        # 输入用户名
        d.find_element_by_name('password').send_keys("student")
        # 输入密码
        d.find_element_by_tag_name('button').click()
        # 点击登录按钮
        d.find_element_by_link_text("供应商").click()
        # 点击供应商按钮

        d.find_element_by_xpath('//*[@id="fmsearch"]/div/div[3]/input').send_keys(list[0])
        # 在供应商名称输入框中分别输入读取的数据
        d.find_element_by_xpath('//*[@id="fmsearch"]/div/div[4]/button').click()
        # 点击查询按钮
        time.sleep(2)

if __name__ == '__main__':
    unittest.main()
    # 调用unittest.main()启动测试

17、数据断言(25)

1.主要方法

self.assertEqual(element, list[1])

2.对比方法

1、比对页面元素的文本信息;
Find_element().text--------这个是获取页面中的文本。
2、通过页面标题;
Driver.title---------可以通过标题做页面调整的验证。
3、通过网址;
Driver.current_url-------通过网址做页面跳转的验证。
4、比对页面元素的属性。
FindElement().get_attribute(“value”)

3.案例

案例步骤:
1、进入资产管理系统登录页面;
2、输入任务ID、用户名和密码;
3、点击登录按钮;
4、点击部门管理按钮;
5、点击新增按钮;
6、在部门名称输入框输入信息,点击保存按钮;
7、在输入名称输入框进行数据驱动和断言代码编写,并进行异常错误处理和对异常错误进行截图。
readdenglu.py
import csv

def readdenglu():
    data = csv.reader(open(r"D:\JetBrains\rczidonghua\zdhcs.csv",'r'))
    list =[]
    i = 0
    for row in data:
        if i !=0:
            list.append(row)
        i=i+1
    return list

if __name__ == '__main__':
    data = readdenglu()
    for row  in data:
        print(row)
Denglu.py
import ddt
import os
import time
import unittest
from selenium import webdriver
from shiXun_Test.shujuduanyan.readdenglu import readdenglu

@ddt.ddt
# ddt修饰器
class Denglu(unittest.TestCase):
    def setUp(self):
        self.d = webdriver.Chrome()
        self.d.implicitly_wait(10)

    def tearDown(self):
        time.sleep(1)
        self.d.quit()

    stream_info=readdenglu()
    @ddt.data(*stream_info)
    def test_denglu(self,list):
        try:
            d = self.d
            d.get('http://10.1.30.75/pams/front/login.do')
            d.find_element_by_id('loginName').send_keys('student')
            d.find_element_by_id('password').send_keys('student')
            d.find_element_by_tag_name('button').click()
            d.find_element_by_link_text('部门管理').click()
            d.find_element_by_xpath('//*[@id="content"]/div[2]/div/div[1]/button').click()
            d.find_element_by_id('title').send_keys(list[0])
            d.find_element_by_id('submitButton').click()
            time.sleep(1)
            d.switch_to.alert.accept()
            # 弹出框处理
            element = d.switch_to.alert.text
            # print(element)
            # 定位实际结果
            self.assertEqual(element, list[1])
            # 对数据进行断言
            time.sleep(2)
        except:
            current_time = time.strftime('%Y-%m-%d_%H_%M_%S')
            # 获取当前系统时间
            current_path = os.path.dirname(__file__)
            # 获取当前绝对路径
            path = current_path+'\\'+current_time+'.png'
            # 路径转换
            print(path)

            # print('页面标题:',d.title)

            # print('页面网址',d.current_url)

            d.get_screenshot_as_file(path)
            # 截图

if __name__ == '__main__':
    unittest.main()

18、discover方法(26)

1.主要用途

​ 将这些用例按照测试功能进行拆分,分散到不同的测试文件中。这时候我们可以通过discover方法来执行所有的测试用例。

2.使用格式

discover(start_dir,pattern='test*.py')
	找到指定目录下所有测试模块,并可递归查到子目录下的测试模块,只有匹配到文件名才能被加载。如果启动的不是顶层目录,那么顶层目录必须单独指定。
	start_dir:要测试的模块名或测试用例目录
	pattern='test*.py':表示用例文件名的匹配原则。此处匹配文件名以“test”开头的“.py”类型的文件,星号“*”表示任意多个字符

3.案例

案例步骤:
设计用例1,新建test_01.py:
    1、进入到资产管理系统登录页面(http://192.168.X.XXX);
    2、输入用户名和密码;
    4、点击登录按钮。

设计用例2,新建test_02.py:
    1、进入到资产管理系统登录页面
    2、输入用户名和密码;
    3、点击登录按钮。
    4、点击“个人信息”按钮;

新建runtest.py:
    通过discover方法来执行所有的测试用例。
test01.py
import unittest
from selenium import webdriver
import time

class Login(unittest.TestCase):
    def setUp(self):
        self.d=webdriver.Chrome()
        self.d.implicitly_wait(10)

    def tearDown(self):
        self.d.quit()

    def test_denglu(self):
        d = self.d
        d.get('http://10.1.30.75/pams/front/login.do')
        d.find_element_by_id('loginName').send_keys('student')
        d.find_element_by_id('password').send_keys('student')
        d.find_element_by_tag_name('button').click()
        # 登陆成功
        time.sleep(2)
test_02.py
import unittest
from selenium import webdriver
import time

class Grxx(unittest.TestCase):
    def setUp(self):
        self.d=webdriver.Chrome()
        self.d.implicitly_wait(10)

    def tearDown(self):
        self.d.quit()

    def test_grxx(self):
        d = self.d
        d.get('http://10.1.30.75/pams/front/login.do')
        d.find_element_by_id('loginName').send_keys('student')
        d.find_element_by_id('password').send_keys('student')
        d.find_element_by_tag_name('button').click()
        # 登陆成功
        d.find_element_by_link_text('个人信息').click()
        # 点击个人信息
        time.sleep(2)
runtest.py
import unittest

test_dir='./test_case'
discover = unittest.defaultTestLoader.discover(test_dir,pattern="test*.py")

if __name__ == '__main__':
    runner = unittest.TextTestRunner()  # 默认不加括号,需要加括号
    runner.run(discover)

19、测试报告(27)

1.下载模块

下载地址:
http://tungwaiyip.info/software/HTMLTestRunner.html
下载后需要做一些修改让他来支持python3(附带文件中有修改好可直接使用的文件):94行引入的名称要改,import StringIO 改成import io。
•539行 self.outputBuffer = StringIO.StringIO() 改成self.outputBuffer=io.StringIO()631print >>sys.stderr, '\nTime Elapsed: %s' % (self.stopTime-self.startTime)
改成:print (sys.stderr, '\nTime Elapsed: %s' %(self.stopTime-self.startTime))642行,if not rmap.has_key(cls): 改成 if not cls in rmap:766行的uo = o.decode('latin-1'),改成 uo=o
•772行,把 ue = e.decode('latin-1') 改成 ue = e
存放路径
将修改完成的模块存放在Python路径下Lib目录里面即可

2.案例

案例步骤
在test_case下新建test_01.py:
1、进入到资产管理系统登录页面(http://192.168.X.XXX);
2、输入任务ID、用户名和密码;
3、点击登录按钮;

新建runtest.py:
通过discover方法执行test_01.py并且引入HTMLTestRunner模块来自动生成测试报告
项目目录
test_01.py
import unittest
import time
from selenium import webdriver

class Login(unittest.TestCase):
    def setUp(self):
        self.d = webdriver.Chrome()
        self.d.implicitly_wait(10)

    def tearDown(self):
    	self.d.quit()

    def test_login(self):
    	d = self.d
        d.get('XX')
        d.find_element_by_id('XX').send_keys('XX')
        d.find_element_by_id('XX').send_keys('XX')
        d.find_element_by_tag_name('XX').click()
        # 登陆成功
        time.sleep(2)
runtest.py
import unittest
from HTMLTestRunner import HTMLTestRunner
import time

test_dir = './test_case'
discover = unittest.defaultTestLoader.discover(test_dir,pattern="test*.py")

if __name__ == '__main__':
    report_dir='./test_report'
    # 测试报告存放位置
    now = time.strftime('%Y-%m-%d_%H_%M_%S')
    # 时间戳
    report_name = report_dir+'\\'+now+'result.html'
    # 文件命名
    with open(report_name,'wb') as f:
        runner = HTMLTestRunner(stream=f,title="Test 		Report",description="test HR")
        runner.run(discover)
    f.close()

20、 PageObject模式(30)

1.PO模式介绍

Page Object是Selenium自动化测试项目开发实践的最佳设计模式之一,主要是将每一个页面设计为一个Class,其中包含页面中需要测试的元素(按钮,输入框,标题 等),这样在Selenium测试页面中可以通过调用页面类来获取页面元素,这样巧妙的避免了当页面元素id或者位置变化时,需要改测试页面代码的情况。 当页面元素id变化时,只需要更改测试页Class中页面的属性即可。 获取页面中元素的属性可以通过idclass或者XPath获取,在id唯一的情况下,可以使用id获取页面元素,否则可以使用XPath定位页面元素。

2.案例

案例步骤

​ 1、进入资产管理系统登录页面;

​ 2、输入用户名和密码;

​ 3、点击登录按钮。

在Page文件中新建文件BasePage.py:
from time import sleep

class Page():
    """基础类,用于所以页面对象类继承"""
    def __init__(self,driver):
        self.driver=driver
        self.base_url='http://10.1.30.75/pams/front/login.do'
        self.timeout=10
    # 初始化
    def _open(self,url):
        url_=self.base_url+url
        print("Test page is %s" %url_)
        self.driver.maximize_window()
        self.driver.get(url_)
        sleep(2)
        assert self.driver.current_url==url_ ,'Did not land on %s' %url_
    # 打开不同的子页面,并对URL地址添加断言
    def open(self):
        self._open(self.url)
    def find_element(self,*loc):
        return self.driver.find_element(*loc)
    # 元素定位方法封装

在Page文件中新建文件LoginPage.py:
from selenium.webdriver.common.by import By
from BasePage import *

class LoginPage(Page):
    url=""
    username_loc=(By.ID,'loginName')
    # 定位用户名输入框
    password_loc=(By.ID,'password')
    # 定位密码输入框
    submit_loc=(By.TAG_NAME,'button')
    # 定位登录按钮

    def type_username(self,username):
        self.find_element(*self.username_loc).clear()
        self.find_element(*self.username_loc).send_keys(username)
    # 输入用户名

    def type_password(self, password):
        self.find_element(*self.password_loc).clear()
        self.find_element(*self.password_loc).send_keys(password)
    # 输入密码

    def type_submit(self):
        self.find_element(*self.submit_loc).click()
    # 点击登录按钮

def test_user_login(driver,username,password):
    login_page=LoginPage(driver)
    login_page.open()
    login_page.type_username(username)
    login_page.type_password(password)
    login_page.type_submit()
# 登录功能模块封装
在test文件中新建文件test_Login.py:
from selenium import webdriver
from LoginPage import *

driver = webdriver.Chrome()

test_user_login(driver,'student','student')
# 输入用户名和密码

sleep(3)

driver.quit()

常见问题

  1. 定位弹出窗口的元素:
    先driver.switch_to.frame(“popup_login_frame”),括号内为弹窗的name
    然后再进行元素操作
  2. 当id,class name中含有空格时,试试将空格替换为"."
  3. 当使用python新建项目编码时,项目根目录需要有Chrome驱动文件
  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值