今日遇到一個(gè)很奇怪的問題
case1:當(dāng)使用順序結(jié)構(gòu)直接從登錄到點(diǎn)擊頁面菜單,則可以正常點(diǎn)擊菜單
case2:若把登錄分離開,采用封裝的方法點(diǎn)擊菜單則會(huì)提示:'NoneType' object has no attribute 'click'
具體頁面如下呵恢,請(qǐng)大家?guī)兔Ψ治鲆幌率鞘裁丛颍?/p>
1、頁面的菜單元素定位使用ID的方法,封裝在allelements.yaml中
2、元素定位方法,以及元素點(diǎn)擊方法封裝如下:
def get_element(self, locator,
timeout=Env.GET_ELEMENT_TIMEOUT,
smp_frequency=Env.SMP_FREQUENCY, desc='') -> WebElement:
"""
獲取元素
:param locator: 元素的定位
:param timeout: 顯示等待的超時(shí)時(shí)長
:param smp_frequency:輪詢頻率(隱式等待)
:param desc:元素的描述(元素的名稱)
:return:定位到的元素
"""
try:
return WebDriverWait(self.driver, timeout, smp_frequency). \
until(EC.visibility_of_element_located(locator))
# return self.driver.find_element(*locator)
except:
# 定位不到元素時(shí),截圖:文件的命名(定位哪一個(gè)元素+時(shí)間)
curtime = time.strftime('%Y%m%d%H%M%S')
self.driver.save_screenshot(f'{SMP_Path.screenshots_path} / {desc}{curtime}.png')
def click_element(self, locator, desc=''): # 普通點(diǎn)擊
self.get_element(locator, desc=desc).click()
3履怯、如果在登錄模塊中直接連續(xù)寫嗲你菜單的操作,則可正常點(diǎn)擊裆泳,如下:
import time
from PageObiects.mainPage import MainPage
from Common.BasePage import BasePage
from configs.env import Env
from Common.allelements import Loginpageelements, Mainpagelements
class LoginPage(BasePage):
def open_loginpage(self):
self.open_url(url=Env.HOST)
def login_host_(self, username, password):
# self.open_url(url=Env.HOST)
LoginPage.open_loginpage(self)
self.input_text(locator=self.username_input, text=username) # 屬性在運(yùn)行后才產(chǎn)生叹洲,所以是標(biāo)黃的
self.input_text(locator=self.password_input, text=password) # 輸入password的定位器,以及文本內(nèi)容
self.click_element(self.login_button)
self.click_element(self.first_menu, desc='點(diǎn)擊菜單按鈕')
return MainPage()
def logout(self):
self.click_element(Mainpagelements.setings)
self.click_element(Mainpagelements.quit)
self.click_element(Mainpagelements.comfirm_)
if __name__ == '__main__':
login = LoginPage()
login.login_host_(username='admin', password='111111')
time.sleep(2)
login.logout()
運(yùn)行結(jié)果如下:可正常運(yùn)行代碼工禾,且點(diǎn)擊菜單元素正常
4运提、在登陸模塊中改成如下代碼:
import time
from PageObiects.mainPage import MainPage
from Common.BasePage import BasePage
from configs.env import Env
from Common.allelements import Loginpageelements, Mainpagelements
class LoginPage(BasePage):
def open_loginpage(self):
self.open_url(url=Env.HOST)
def login_host_(self, username, password):
# self.open_url(url=Env.HOST)
LoginPage.open_loginpage(self)
self.input_text(locator=self.username_input, text=username) # 屬性在運(yùn)行后才產(chǎn)生,所以是標(biāo)黃的
self.input_text(locator=self.password_input, text=password) # 輸入password的定位器闻葵,以及文本內(nèi)容
self.click_element(self.login_button)
# self.click_element(self.first_menu, desc='點(diǎn)擊菜單按鈕') 此處不做點(diǎn)擊操作
return MainPage()
def logout(self):
self.click_element(Mainpagelements.setings)
self.click_element(Mainpagelements.quit)
self.click_element(Mainpagelements.comfirm_)
if __name__ == '__main__':
login = LoginPage()
login.login_host_(username='admin', password='111111')
time.sleep(2)
MainPage().get_element('id', 'cai').click() # 在此處作點(diǎn)擊操作
login.logout()
運(yùn)行結(jié)果如下:
為了驗(yàn)證該對(duì)象是否真的為Nonetype民泵,我在主頁面添加了print做調(diào)試,調(diào)試結(jié)果如下:
通過以上對(duì)菜單元素的輸出笙隙,可得知洪灯,改元素并不是nonetype,與登錄操作連續(xù)執(zhí)行時(shí),可正常的點(diǎn)擊竟痰。
那么為什么签钩,相同的定位方式,與登錄連續(xù)著寫可正常點(diǎn)擊坏快,而分開成兩個(gè)部分編寫就提示為Nonetype呢铅檩?是否有大佬可以解答一下?