python+selenium之点击元素报错:‘NoneType‘ object has no attribute ‘click‘

今日遇到一个很奇怪的问题
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呢?是否有大佬可以解答一下?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/719834.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 字符串分隔(二)(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 字符串分隔(二)(100分) 🌍 评测功能需要订阅专栏后私信联系…

玩转nRF52840-DK开发套件 (5) RTT打印调试日志

一、两种日志信息的输出方式 日志信息输出可以方便调试者观察程序运行状态,通常用串口 printf 来输出日志。nRF52840-DK也可以用仿真器 JLink 的 RTT Viewer 输出方式。 二、SDK_config.h配置 勾选相关项: 三、SDK_config.h配置 在主函数 main 中&#x…

一图看懂华为云CodeArts API 7大特性,带你玩转一站式API

华为云CodeArts API是API全生命周期一体化协作平台 ,支持开发者高效实现API设计、API开发、API测试、API托管、API运维、API变现的一站式体验。以API契约为锚点,CodeArts API保证了API各阶段数据高度一致,为开发者提供友好易用的API全流程端到…

如何在本地部署ChatTTS? 完美部署 简单几步 cpu gpu cuda

前言 最近,24-05-27号,github上出现了一个新项目,ChatTTS。该项目提供了一个文本转语音(Text To Speech)的开源方案,同时支持中文和英文。在官网的演示视频中,可以看到合成效果高度接近真人。 到目前(06-04)为止,已经有18.3k的star。 那我们就来看看这个模型的基本…

录制视频软件哪个好?录制视频,4款好软件推荐

随着网络技术的飞速发展和社交媒体的普及,录制视频已经成为人们记录生活、分享知识和展示才华的重要方式。在众多录制视频软件中,如何挑选一款功能强大、操作简便的工具,成为了许多用户的难题。本文将为您推荐4款优秀的录制视频软件&#xff…

想体验“时光倒流”吗?文件时光机——可道云teamOS,历史版本管理,随时回溯版本

大家在工作中,遇到过的最奔溃的事情是什么? 是工作没有做好,还是客户要求太离谱? 不知道大家有没有过这样的经历,根据客户要求改方案、改稿子,改了一版又一版,结果客户说还是最初版本更好………

深入理解计算机系统 CSAPP 家庭作业6.40

这书真是会绕. A:16*16*4 B:256 ,第一个for 50%不命中 0.5*16*16.第二个for 每两个循环1次不命中 也就是128次 C:0.25

【Python机器学习实战】 | 基于决策树的药物研究分类预测

🎩 欢迎来到技术探索的奇幻世界👨‍💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…

C#开发-集合使用和技巧(六)特殊转换方法SelectMany的介绍和用法

介绍 SelectMany 方法在C#中用于将集合中的元素转换为其他类型的集合&#xff0c;并将这些集合扁平化为一个单一的序列。它是LINQ的一部分&#xff0c;允许你在一个序列上进行投影和过滤操作&#xff0c;然后将结果合并成一个序列。 方法定义 public static IEnumerable<…

面向对象进阶--继承(Java继承(超详解))

目录 1. 继承 1.1 继承概述 1.2 继承特点 1.3练习 1.4继承父类的内容 构造方法是否被子类继承 成员变量是否被子类继承 成员方法是否被子类继承 1.5总结 继承中&#xff1a;成员变量的访问特点 继承中&#xff1a;成员方法的访问特点 方法重写概述 方法重写的本质 …

什么是浅拷贝和深拷贝,如何用 js 代码实现?

〇、简介和对比 简介 浅拷贝&#xff1a;只复制原始对象的第一层属性值。 如果属性值是值类型&#xff0c;将直接复制值&#xff0c;本值和副本变更互不影响&#xff1b; 如果是引用数据类型&#xff0c;则复制内存地址&#xff0c;因此原始对象和新对象的属性指向相同的内存地…

小规模自建 Elasticsearch 的部署及优化

本文将详细介绍如何在 CentOS 7 操作系统上部署并优化 Elasticsearch 5.3.0,以承载千万级后端服务的数据采集。要使用Elasticsearch至少需要三台独立的服务器,本文所用服务器配置为4核8G的ECS云服务器,其中一台作为 master + data 节点、一台作为 client + data 节点、最后一…

【学习Docker】

学习Docker可以分为几个步骤和阶段&#xff0c;以下是一个建议的学习路径&#xff0c;适合初学者到进阶用户&#xff1a; ### 1. 理解基本概念 - **容器化与虚拟化**&#xff1a;了解容器化与传统虚拟化之间的区别&#xff0c;容器的轻量级和效率。 - **Docker组件**&#xff…

基于EXCEL数据表格创建省份专题地图

1 数据源 随着西藏于5月1日发布2022年一季度经济运行情况&#xff0c;31省份一季度GDP数据已全部出炉。 总量方面&#xff0c;粤苏鲁稳居前三&#xff1b;增速方面&#xff0c;23省份高于“全国线”&#xff0c;新疆表现最佳&#xff0c;增速达到7.0%。 表格表现数据不够直观…

使用 Dapper 创建 Blazor Server SPA

介绍 Blazor 是 Microsoft 构建的一个新框架&#xff0c;用于使用 .NET 代码库创建交互式客户端 Web UI。 Dapper 是一个微型 ORM&#xff08;对象关系映射器&#xff09;&#xff0c;可帮助将本机查询输出映射到领域类。它是由 StackOverflow 团队构建并作为开源发布的高性能…

Ubuntu 使用Vscode的一些技巧 ROS

Ubuntu VSCode的一些设置&#xff08;ROS&#xff09; 导入工作空间 推荐只导入工作空间下的src目录 如果将整个工作空间导入VSCode&#xff0c;那么这个src就变成了次级目录&#xff0c;容易在写程序的时候把本应该添加到具体工程src目录里的代码文件给误添加到这个catkin_w…

如何使用Gitmails在版本控制主机中收集Git提交邮件

关于Gitmails Gitmails是一款能够在Git版本控制主机服务中收集Git提交电子邮件的信息收集工具&#xff0c;该工具可以帮助广大研究人员扫描和识别Git提交中包含的作者名称、电子邮件配置和版本控制主机服务是否存储了多个项目。 想要了解网络安全&#xff0c;学习网络安全知识…

SpringMVC系列九: 数据格式化与验证及国际化

SpringMVC 数据格式化基本介绍基本数据类型和字符串自动转换应用实例-页面演示方式Postman完成测试 特殊数据类型和字符串自动转换应用实例-页面演示方式Postman完成测试 验证及国际化概述应用实例代码实现注意事项和使用细节 注解的结合使用先看一个问题解决问题 数据类型转换…

数据中心分类和类别综合指南

数据中心可根据其规模、功能、所有权、层级和部署方法进行分类。以下是一些典型的数据中心类别和分类。 数据中心的分类和分级 根据尺寸 1. 小型数据中心&#xff1a;通常是为了满足对IT基础设施需求较少的组织或小型企业的需求而创建的。与大型数据中心相比&#xff0c;小型…