每次写用例,有个前置条件,都会写上已登录。
但是Web自动化,如何实现已登录的功能呢,有写成一个函数在每个用例执行前调用一次的,也有利用前置条件如:setup,__init__等方法来解决登录的,我这里决定专门写个登录的装饰器来实现登录的功能。
代码如下:写了一个用来登录的装饰器,判断是否登录成功,登录成功就继续执行搜索商品的代码,如果没有登录成功就关闭浏览器,不执行搜索商品的代码。
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
url = "http://www.zutuan.cn/login.html#/"
class LoginPage():
js = "document.getElementsByClassName('a-title')[0].click()"
loc_3 = (By.XPATH, '//input[@type="text" or @class="userName"]')
loc_4 = (By.XPATH, '//input[@type="password"]')
loc_5 = (By.XPATH, '//div[@class="button"]')
loc_6 = (By.XPATH, '//div[@class="login"]') # 断言
loc = LoginPage()
def login(func):
def wrapper(driver):
driver.get(url)
driver.maximize_window()
driver.execute_script(loc.js) # TODO js点击元素
driver.find_element(*loc.loc_3).send_keys("1489088761@qq.com")
driver.find_element(*loc.loc_4).send_keys("mg123456")
driver.find_element(*loc.loc_5).click()
time.sleep(0.5)
driver.refresh()
text = driver.find_element(*loc.loc_6).text # todo 判断是否登录成功,成功返回True
print("登录成功获取到的页面文本内容是:{}".format(text))
if text == "您好 1489088761@qq.com [退出]":
func(driver)
else:
print("登录失败")
time.sleep(1)
driver.quit()
return text == "您好 1489088761@qq.com [退出]"
return wrapper
@login
def search_commodity(driver):
"""搜索商品"""
driver.find_element_by_xpath('//input[@type="text"]').send_keys("手机")
driver.find_element_by_xpath('//div[@class="search"]').click()
driver = webdriver.Chrome()
res = search_commodity(driver)
print(res)