元素定位,元素操作。
原则:sleep -调试
框架?架子
PO模式 - pageObject -页面对象
web网页测试 -测试用例:全部都是在页面上操作的
测试用例:不同页面当中的操作 串起来的
300个测试用例–30个页面。
30个页面–定义30个页面类(属性和行为) --行为:当前页面的操作。
用例1=页面A的操作1 -页面B的操作4 -页面C的操作5 -页面C的行为6
中心思想:测试对象和测试用例,彻底分离
好处:1.页面当中元素定位,元素操作发生变化。与用例无关。
2.用例当中用顺序发生了变化,与测试对象无关。
测试用例:
"""
======================
@Author:coco
@Time:2019/12/28
@File:home_page.py
@software:PyCharm
======================
"""
from selenium.webdriver.common.by import By
from selenium.webdriver.remote.webdriver import WebDriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
class HomePage:
# 我的账号 元素
my_user_name = (By.XPATH,'//a[contains(text(),"我的帐户")]')
def __init__(self,driver:WebDriver):
self.driver = driver
# 用户名是否存在
def user_is_existed(self):
"""
如果用户存在,则返回True,如果用户名元素不存在,则返回False
"""
try:
WebDriverWait(self.driver,10).until(EC.visibility_of_element_located(self.my_user_name))
except:
return False
else:
return True
"""
======================
@Author:coco
@Time:2019/12/28
@File:login_page.py
@software:PyCharm
======================
"""
from selenium.webdriver.common.by import By
from selenium.webdriver.remote.webdriver import WebDriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
# 1.导入wedbriver,实例化
# 2.外部传参
class LoginPage:
# 用户名输入框
user_input = (By.XPATH,'//input[@name="phone"]')
# 密码输入
password_input = (By.XPATH,'//input[@name="password"]')
# 登录按钮
login_button = (By.TAG_NAME,'button')
# 表单区域的错误提示框
error_from_login_form = (By.XPATH,'//div[@class="form-error-info"]')
def __init__(self,driver:WebDriver):
self.driver = driver
# 登录行为
def login(self,username,passwd):
# 等待??
WebDriverWait(self.driver,20).until(EC.visibility_of_element_located(self.login_button))
# 输入用户名
self.driver.find_element(*self.user_input).send_keys(username)
self.driver.find_element(*self.password_input).send_keys(passwd)
self.driver.find_element(*self.login_button).click()
# 获取表单区域的错误提示信息
def error_msg_from_login_form(self):
WebDriverWait(self.driver,20).until(EC.visibility_of_element_located(error_msg_from_login_form()))
return self.driver.find_element(*self.error_from_login).text
"""
======================
@Author:coco
@Time:2019/12/28
@File:test_login.py
@software:PyCharm
======================
"""
import unittest
from selenium import webdriver
import time
from web_20191226.PageObjects.login_page import LoginPage
from web_20191226.PageObjects.home_page import HomePage
import ddt
@ddt.ddt
class TestLogin(unittest.TestCase):
def setUp(self) -> None:
# 打开谷歌浏览器
self.driver = webdriver.Chrome()
self.driver.maximize_window()
# 访问 系统登陆页面
self.driver.get("http://120.78.128.25:8765/Index/login.html")
self.lp = LoginPage(self.driver)
def tearDown(self) -> None:
# 退当前会话
self.driver.quit()
def test_login_success(self):
# 步骤
# 1、登陆页面 - 登陆操作
self.lp.login("18684720553","python")
# 断言
# 1、url发生改变: http://120.78.128.25:8765/Index/index
time.sleep(2)
self.assertEqual("http://120.78.128.25:8765/Index/index",self.driver.current_url)
# 2、首页 - 确认 我的帐号 元素是否存在。
self.assertTrue(HomePage(self.driver).user_is_existed())
wrong_datas = [
{"username":"","passwd":"python","check":"请输入手机号"},
{"username": "18684720553", "passwd": "", "check": "请输入密码"},
{"username": "1868472055", "passwd": "python", "check": "请输入正确的手机号"}
]
@ddt.data(*wrong_datas)
def test_login_failed_by_wrong_datas(self,case):
# 步骤
# 1、登陆页面 - 登陆操作
self.lp.login(case["username"],case["passwd"])
# 断言
self.assertEqual(self.lp.get_error_msg_from_login_form(),case["check"])