软件测试知识

python+selenium之点击元素报错:'NoneType

2024-06-13  本文已影响0人  小小一颗卤蛋

今日遇到一个很奇怪的问题
case1:当使用顺序结构直接从登录到点击页面菜单,则可以正常点击菜单
case2:若把登录分离开,采用封装的方法点击菜单则会提示:'NoneType' object has no attribute 'click'

具体页面如下,请大家帮忙分析一下是什么原因?


image.png

1、页面的菜单元素定位使用ID的方法,封装在allelements.yaml中


image.png
2、元素定位方法,以及元素点击方法封装如下:
    def get_element(self, locator,
                    timeout=Env.GET_ELEMENT_TIMEOUT,
                    smp_frequency=Env.SMP_FREQUENCY, desc='') -> WebElement:
        """
        获取元素
        :param locator: 元素的定位
        :param timeout: 显示等待的超时时长
        :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:
            # 定位不到元素时,截图:文件的命名(定位哪一个元素+时间)
            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=''):  # 普通点击
        self.get_element(locator, desc=desc).click()

3、如果在登录模块中直接连续写嗲你菜单的操作,则可正常点击,如下:

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)  # 属性在运行后才产生,所以是标黄的
        self.input_text(locator=self.password_input, text=password)  # 输入password的定位器,以及文本内容
        self.click_element(self.login_button)
        self.click_element(self.first_menu, desc='点击菜单按钮')
        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()

运行结果如下:可正常运行代码,且点击菜单元素正常


image.png

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)  # 属性在运行后才产生,所以是标黄的
        self.input_text(locator=self.password_input, text=password)  # 输入password的定位器,以及文本内容
        self.click_element(self.login_button)
        # self.click_element(self.first_menu, desc='点击菜单按钮')  此处不做点击操作
        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()  # 在此处作点击操作
    login.logout()

运行结果如下:


image.png
为了验证该对象是否真的为Nonetype,我在主页面添加了print做调试,调试结果如下: image.png
通过以上对菜单元素的输出,可得知,改元素并不是nonetype,与登录操作连续执行时,可正常的点击。

那么为什么,相同的定位方式,与登录连续着写可正常点击,而分开成两个部分编写就提示为Nonetype呢?是否有大佬可以解答一下?

上一篇 下一篇

猜你喜欢

热点阅读