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

news2024/11/27 4:15:00

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue01-前端概述

一、前端核心分析 1.1、概述 Soc原则:关注点分离原则 Vue 的核心库只关注视图层,方便与第三方库或既有项目整合。 HTML CSS JS : 视图 : 给用户看,刷新后台给的数据 网络通信 : axios 页面跳转 : v…

发那科机器人IO 分配

IO 信号 也称为输入\输出信号,是机器人与外围设备通信的电信号

Android 断点续传基础之单线程下载

**遇到的问题:**在这因为返回值的问题烦躁了一下,有可能出现空指针的异常,已经提出成文章了 请参考http://blog.csdn.net/qq_27489007/article/details/53523378 文件关系图 断点续传流程图 开始撸代码(主要代码) /** 普通断点续传 */ …

FirstChip1179量产经历(附FirstChipMpTools_v20200430工具)

前言: 新工作的原因,需要频繁用到u盘,手头上有2个常用的U盘(龙凤呈祥57.3G(64G)) 一个用来存放课件ppt、word、excel等文件;一个用来存放一些软件工具; ps&#xff0c…

将Typora中图片从指定路径移动到当前文件夹下(准确位置为:XX.md文件所在目录/XX.assets/)

1、背景介绍 最开始时候,将复制到Typora中的图片放在了指定位置。但是在进行迁移(在别的电脑上打开md文件),会发现发送过来的文件不包含图片,导致文件内容缺失。解决办法就是将图片放在XX.md文件所在目录/XX.assets/。 2、方法 2.1 做好文件备份 2.2 替换图片链接中的…

又一个SQL Developer中调试存储过程的例子

此例基于OBE(Oracle By Example)的示例。是在SQL Developer中调试存储过程一文的进阶。复习了前文的一些基本概念,并纠正了官方示例的一个错误。 本文使用的是标准的HR 示例 Schema,调试的存储过程源代码如下: CREAT…

针对k8s集群已经加入集群的服务器进行驱逐

例如k8s 已经有很多服务器,现在由于服务器资源过剩,需要剥离一些服务器出来 查找节点名称: kubectl get nodes设置为不可调度: kubectl cordon k8s-node13恢复可调度 kubectl uncordon k8s-node13在驱逐之前先把需要剥离驱逐的节…

Vite+Vue3安装且自动按需引入Element Plus组件库

一,安装Element Plus npm install element-plus //node环境16二,安装插件 npm install unplugin-auto-import unplugin-vue-components -D三,配置vite.config.ts文件 //按需引入element-plus组件 import AutoImport from unplugin-auto-i…

电手出软件啦!各种姿势一键重装你的系统

电手的兄弟们你们好啊,很多兄弟都知道,我们老大傲梅是做软件的,例如大伙儿都用过的傲梅分区助手,还有傲梅轻松备份。相信不少兄弟都是用了分区助手才关注到电手的。 而我们电手,在电脑和手机玩机内容方面一直深耕。 跟…

9.2.2 DeepLab系列模型中每一代的创新是什么?是为了解决什么问题?

9.2.2 DeepLab系列模型中每一代的创新是什么?是为了解决什么问题? 前情回顾:9.2.1 简述图像分割中经常用到的编码器-解码器网络结构的设计理念。 DeepLab是Google 团队提出的一系列图像分割算法。 DeepLab v1在2014年被提出,并在…

SpringMVC系列十一: 文件上传与自定义拦截器

文章目录 SpringMVC文件上传基本介绍需求分析 / 图解应用实例-代码实现 自定义拦截器什么是拦截器自定义拦截器执行流程分析图自定义拦截器应用实例快速入门注意事项和细节Debug执行流程 多个拦截器多个拦截器执行流程示意图应用实例1代码实现注意事项和细节 应用实例2 作业布置…

汇编语言程序设计 - 新建一个文件:d:\abc.txt,从键盘输入文件的内容(不超过100个字符)

80x86汇编习题 题目描述:编写一个程序,新建一个文件:d:\abc.txt,从键盘输入文件的内容(不超过100个字符) 思路: 1,定义好文件名,记得末尾0 2,定义好缓冲区…

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

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

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

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

Python内置debug库: pdb用法详解

文章目录 0. 引言1. 基本用法1.1 设置断点1.2 通过命令行启动 pdb 2. 常用命令2.1 n (next)2.2 s (step)2.3 c (continue)2.4 l (list)2.5 p (print)2.6 h (help)2.7 b (break)2.8 cl (clear)2.9 q (quit) 3. 例子 0. 引言 pdb&#xff08;Python Debugger&#xff09;是Pytho…

【Redis】分布式锁基本理论与简单实现

目录 分布式锁解释作用特性实现方式MySQL、Redis、Zookeeper三种方式对比 原理 reids分布式锁原理目的容错redis简单分布式锁实现锁接口实现类下单场景的实现容错场景1解决思路优化代码 容错场景2Lua脚本Redis利用Lua脚本解决多条命令原子性问题 释放锁的业务流程Lua脚本来表示…

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

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

游泳耳机哪个牌子好性价比高?精选高性价比的四大游泳耳机!

在现代社会中&#xff0c;随着健身和水中运动的普及&#xff0c;游泳耳机作为一种关键的健身配件&#xff0c;正日益受到广泛关注和需求。无论是在游泳池畅游还是深潜海底&#xff0c;好的游泳耳机不仅能提供高品质的音乐享受&#xff0c;更能保护耳朵免受水压和湿润环境的侵害…

训练营第四十一天| 1035.不相交的线53. 最大子序和392.判断子序列115.不同的子序列

1035.不相交的线 力扣题目链接(opens new window) 我们在两条独立的水平线上按给定的顺序写下 A 和 B 中的整数。 现在&#xff0c;我们可以绘制一些连接两个数字 A[i] 和 B[j] 的直线&#xff0c;只要 A[i] B[j]&#xff0c;且我们绘制的直线不与任何其他连线&#xff08;…

线上扭蛋机小程序开发,潮玩时代的创新发展

随着互联网的发展&#xff0c;扭蛋机市场也进行了创新发展&#xff0c;线上扭蛋机小程序为市场带来了新活力。扭蛋机小程序将传统的模式与互联网结合&#xff0c;打造一个便捷有趣的扭蛋机市场。 一、扭蛋机小程序 在扭蛋机小程序上&#xff0c;用户通过扭蛋机抽取各种系列的…