如果要继承登录,必须要在对象中初始化登录,测试用例中初始化登录。
基类:
#-*-coding:gbk-*-
import time
from selenium import webdriver
from selenium.webdriver import ActionChains
# def getBrowser(browser_type):
# try:
# if browser_type=="Chrome":
# driver=webdriver.Chrome()
# else:
# driver=getattr(webdriver,browser_type)()
# return driver
# except Exception as e:
# print(e)
# return webdriver.Chrome()
# #driver=webdriver.Chrome(r"D:\Python3.7\Scripts\chromedriver.exe")
class BrowerBase:
#构造函数,获取浏览器
def __init__(self,driver):
#self.driver=getBrowser(browser_type)
self.driver=driver
#访问url
def open_url(self,url):
self.driver.get(url)
#查找元素
def locator(self,loc):
return self.driver.find_element(*loc)
#输入内容
def input_(self,loc,txt):
self.locator(loc).send_keys(txt)
#点击操作
def click_(self,loc):
self.locator(loc).click()
#清空输入框内容
def clear(self,loc):
self.locator(loc).clear()
#鼠标悬浮到某位置
def moveMouse(self,loc):
ActionChains(self.driver).move_to_element(self.locator(loc)).perform()
#等待几秒
def wait(self,sj):
time.sleep(sj)
#获取title标题
def get_title(self):
return self.driver.title
#切换到主文档窗口
def switch_frame(self):
self.driver.switch_to.default_content()
#刷新F5
def refresh_(self):
self.driver.refresh()
#切换到指定窗口
def SwitchWindow(self,windowsname):
# 首先获取主窗口的句柄保存在变量中
mainWindow = self.driver.current_window_handle
# 遍历所有窗口句柄
for handle in self.driver.window_handles:
# 先切换到该窗口
self.driver.switch_to.window(handle)
# 得到该窗口的标题栏字符串,判断是不是我们要操作的那个窗口
if windowsname in self.driver.title:
# 如果是,这个webdriver对象就是对应的该窗口,正好跳出循环
break
# 再在新窗口中进行相应操作
#print(self.driver.title)
#退出进程浏览器
def quit_(self):
self.driver.quit()
#关闭浏览器
def close_(self):
self.driver.close()
读取文件:
#-*-coding:utf-8-*-
import os
import yaml
class ReadYaml:
#通过init方法把yaml文件传入到这个类,若传入文件名则用传入得文件,若未传入参数则使用默认的logindata.yaml
def __init__(self,filename=None):
if filename:
self.yaml_file=filename
else:
#获取项目路径
current_path=os.path.dirname(os.path.abspath('.'))
self.yaml_file=current_path+"/Data/logindata.yaml"
# 读取yaml文件,f表示文件流,Loader=yaml.FullLoader表示加载方式
def read_yaml(self):
try:
with open(self.yaml_file,mode='r',encoding='gbk') as f:
#load读取文件对象
data=yaml.load(f,Loader=yaml.FullLoader)
except Exception as e:
print("文件读取失败:%s"%e)
f.close()
return data
#在某个文件中追加文件
def write_yaml(self):
casedata={
"loginuser6":{
"name":"boy",
"pwd":"999999"
}
}
#打开文件
with open(self.yaml_file,mode='a',encoding="utf-8") as f:
#dump是写入文件对象,allow_unicode=True预防出现乱码
write_data=yaml.dump(casedata,f,allow_unicode=True)
f.close()
if __name__ == '__main__':
ry=ReadYaml("../Data/keywordsearch.yaml")
#ry.write_yaml()
s=ry.read_yaml()
print(s)
页面对象类:
登录
#-*-coding:gbk-*-
import time
import allure
from selenium import webdriver
from selenium.webdriver.common.by import By
from Base.OperatingBase import BrowerBase
class LoginPage(BrowerBase):
url= r'https://passport.jd.com/new/login.aspx?ReturnUrl=https%3A%2F%2Fwww.jd.com%2F'
login_tab = (By.XPATH, "//*[@class='login-tab login-tab-r']")
login_name = (By.ID, "loginname")
login_pwd = (By.ID, "nloginpwd")
login_btn = (By.CLASS_NAME, "login-btn")
result_success = (By.XPATH,"//*[@class='user_plusico']/following-sibling::a")
result_error=(By.XPATH,"//*[@class='msg-error']")
user_logout=(By.XPATH,"//*[@class='user_logout']")
@allure.step("step1:登录操作")
def login(self,usrname,password):
self.open_url(self.url)
self.click_(self.login_tab)
self.clear(self.login_name)
self.input_(self.login_name,usrname)
self.clear(self.login_pwd)
self.input_(self.login_pwd, password)
self.click_(self.login_btn)
self.wait(15)
#登录成功后,获取当前页面的用户名,判断用户名
def login_result(self):
if self.get_title()=='京东-欢迎登录':
r=self.locator(self.result_error).text
else:
r = self.locator(self.result_success).text
return r
退出登录
#-*-coding:gbk-*-
import allure
from selenium.webdriver.common.by import By
from Base.OperatingBase import BrowerBase
class LogOutPage(BrowerBase):
#初始化登录
def __init__(self,login):
BrowerBase.__init__(self,login.driver)
#找到账号标签
nickname=(By.CLASS_NAME,'nickname')
#找到退出按钮标签
logout_text = (By.CLASS_NAME, 'link-logout')
@allure.step("step2:退出登录")
def logout(self):
self.moveMouse(self.nickname)
self.click_(self.logout_text)
#切回到frame框架
self.switch_frame()
self.wait(3)
def logoutSuccess(self):
#返回退出后的title
return self.get_title()
测试类:
登录:
#-*-coding:gbk-*-
import pytest
from selenium import webdriver
from Config.read_yaml import ReadYaml
from PageObject.Login_Page import LoginPage
class TestLogin:
def setup_class(self):
#浏览器初始化
self.driver = webdriver.Chrome(r"D:\Python3.7\Scripts\chromedriver.exe")
#登录初始化
self.lp = LoginPage(self.driver)
@pytest.mark.parametrize('data',ReadYaml('../Data/logindata.yaml').read_yaml())
def test_login(self,data):
self.lp.login(data["name"],data["pwd"])
assert self.lp.login_result()==data["text"],'实际结果是:{0}'.format(data["text"])
# def teardown_class(self):
# self.lp.quit_()
if __name__ == '__main__':
pytest.main(['-vs','./test_login.py'])
退出:
#-*-coding:gbk-*-
import pytest
from PageObject.LogOut_Page import LogOutPage
from TestCase.test_login import TestLogin
class TestLogOut:
#初始化登录
def setup_class(self):
self.login=TestLogin()
self.loginout=LogOutPage(self.login)
def test_logout_1(self):
self.loginout.logout()
assert self.loginout.logoutSuccess()=='京东-欢迎登录'
if __name__ == '__main__':
pytest.main(['-vs','./test_logout.py'])