来自文件index_page.py
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
class IndexPage:
def __init__(self,driver):
self.driver=driver
def isExist_logout_ele(self):
# 等待10秒 元素有没有出现 //a[@href="/Index/logout.html"]
#如果存在就返回True,不存在就返回False
try:
WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.XPATH, '//a[@href="/Index/logout.html"]')))
return True
except:
return False
来自文件login_page.py
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
class LoginPage:
def __init__(self,driver):
self.driver=driver
#登陆
def login(self,username,passwd,remember_user=True):
#输入用户名
#输入密码
#点击登陆
name_text='//input[@name="phone"]'
pwd_text='//input[@name="password"]'
login_but='//button[text()="登录"]'
WebDriverWait(self.driver,20).until(EC.visibility_of_element_located((By.XPATH,name_text)))
self.driver.find_element_by_xpath(name_text).send_keys(username)
self.driver.find_element_by_xpath(pwd_text).send_keys(passwd)
#判断一下rember_user的值,来决定是否勾选
self.driver.find_element_by_xpath(login_but).click()
#注册
def register_enter(self):
WebDriverWait(self.driver,20).until(EC.visibility_of_element_located((By.XPATH,"")))
self.driver.find_element_by_xpath("").click()
#忘记密码
来自文件test_login.py
import unittest
from selenium import webdriver
from PageObjects.login_page import LoginPage
from PageObjects.index_page import IndexPage
class TestLogin(unittest.TestCase):
def setUp(self):
# 前置 访问登陆页面
self.driver=webdriver.Chrome()
self.driver.get('http://120.78.128.25:8765/Index/login.html')
self.lg=LoginPage(self.driver)
def tearDown(self):
#后置
self.driver.quit()
# 正常用例-登陆成功
def test_login_success(self):
#步骤 输入用户名:XXx 密码XXX 点击登陆
self.lg.login('18684720553','python')
#断言 首页当中-能否找到 退出 这个元素
self.assertTrue(IndexPage(self.driver).isExist_logout_ele())
#
# #异常用例 -手机号格式不正确 ddt
# def test_login_user_wrongFormat(self):
# self.lg.login('1868472', 'python')
# # 步骤 输入用户名:XXx 密码XXX 点击登陆
# # 断言 登陆页面 提示:请输入正确的手机号
# pass
#
# #异常用例 - 用户名为空
# def test_login_noUser(self):
# self.lg.login('', 'python')
# # 步骤 输入用户名:XXx 密码XXX 点击登陆
# # 断言 登陆页面 提示:请输入手机号
# pass
#异常用例-未注册手机号
#异常用例-错误的密码
#异常用例-不输入密码
运行结果:
运行代码的时候能看到浏览器窗口外的,自动化打开的窗口,显示的时候并不是全屏的。
有的情况下需要滚动滚动条,有的情况下不需要滚动也可以操作。现在只是判断能不能找得到它,存不存在,并不是判断我要进行点击等各种操作。只是看它存不存在,有没有,可不可见。浏览器自己去操作了,你可能看不到是正常的。
没做点击等各种操作,只是判断有没有而已。
测试用例中一定要有前置,用例,断言。(页面类的函数调用、测试数据、断言)
测试用例=测试数据+页面方法调用
先写注释,再想想这个注释我该如何实现。
没任何区别。pass就是个占位符。
刚开始写测试用例,没用任何步骤,没任何代码实现,如果不写任何东西是会报错的。就写个pass占个坑,就不会报错了。如果测试用例中的步骤都写了,写不写pass都可以。
self.assertTrue(IndexPage(self.driver).isExist_logout_ele())
不同的断言函数,它的参数是不一样的,这个断言函数只有一个参数。
当你有几百个用例的时候,断言很多,如果不根据页面封装起来,那后面就抓瞎了。
web自动化中的断言,每个用例都不一样,不像接口非常固定,不需要准备个断言数据放那,可以自己页面获取数据动态比对。
有测试报告。测试报告会显示通过or失败。
以及业务过程中的使用方式。比如这两个功能全部是放一起使用的,那你可以把它封装在一起。如果本身就是分开的,那就把它分开封装。
所以,面临一个测试用例非常复杂的情况下,那你可以把它分成多个。分成多个测试函数,按照步骤一个一个来就好了。
未完待续~