Selenium常见问题解析

news2025/1/15 13:13:36

1、元素定位失败:

在使用Selenium自动化测试时,最常见的问题之一是无法正确地定位元素,这可能导致后续操作失败。解决方法包括使用不同的定位方式(如xpath、CSS selector、id等),等待页面加载完全后再进行操作,或者增加元素定位的鲁棒性。

举个例子:

假设我们要定位一个登录页面的“用户名”输入框,但是该输入框没有id等唯一标识符,我们可以使用其上层标签div的class属性和下层标签input的name属性作为xpath表达式进行定位。

username_input = driver.find_element_by_xpath("//div[@class='login-form']/input[@name='username']") 

2、难以定位隐藏元素:

有些网页上的元素默认是隐藏的,比如下拉框或弹窗等,这些元素难以被Selenium直接定位到。解决方法包括使用JavaScript语句实现显示或者css属性控制元素的可见性。

下面是一个通过JavaScript将元素显示出来的例子:

driver.execute_script("document.getElementById('element_id').style.display = 'block';")

3、元素操作无效:

Selenium有时会因为一些原因无法对元素进行操作。解决方法包括等待元素加载完成后再尝试操作、检查元素是否可见和启用等。

下面是一个等待“确认”按钮出现并单击的例子:

confirm_button = WebDriverWait(driver, 10).until(expected_conditions.element_to_be_clickable((By.ID, 'confirm-btn'))) 
confirm_button.click() 

4、多窗口切换问题:

当网页上有多个窗口时,Selenium需要正确地切换到目标窗口,否则后续操作无法成功。解决方法包括使用window_handles属性获取窗口句柄、switch_to_window()方法切换窗口、以及使用WebDriverWait等待目标窗口的出现。

下面是一个切换到最新打开窗口并获取标题的例子:

# 获取当前窗口句柄 
current_handle = driver.current_window_handle 

# 打开新窗口 
driver.execute_script("window.open('https://www.example.com');") 

# 等待新窗口出现,并切换到新窗口 
WebDriverWait(driver, 10).until(lambda d: len(d.window_handles) > 1) 
for handle in driver.window_handles: 
    if handle != current_handle: 
        driver.switch_to.window(handle) 
        
# 获取新窗口标题 
print(driver.title)

5、页面加载慢:

在进行自动化测试时,网页的加载速度会对测试结果产生影响。解决方法包括使用适当的浏览器驱动程序、减小页面请求大小、使用无头浏览器等。

下面是一个使用Chrome无头浏览器进行测试的例子:

from selenium.webdriver import Chrome 
from selenium.webdriver.chrome.options import Options 

# 创建Chrome无头浏览器实例 
chrome_options = Options() 
chrome_options.add_argument('--headless') 
chrome_options.add_argument('--disable-gpu') 
driver = Chrome(options=chrome_options) 

# 打开网页并执行测试操作 
driver.get('https://www.example.com') 
# ...

6、网络连接问题:

Selenium需要与远程浏览器通信,因此网络连接问题会导致测试失败。解决方法包括检查网络设置、检查防火墙和代理配置等。

举个例子:

如果你的网络环境需要使用代理才能访问外部网站,可以在创建WebDriver实例时设置代理参数:

from selenium.webdriver.common.proxy import Proxy, ProxyType 

# 创建代理对象 
proxy = Proxy({ 
    'proxyType': ProxyType.MANUAL, 
    'httpProxy': 'http://your.proxy.server:8080', 
    'ftpProxy': 'ftp://your.proxy.server:8080', 
    'sslProxy': 'https://your.proxy.server:8080', 
    'noProxy': '' 
}) 

# 创建Chrome浏览器实例,并设置代理 
chrome_options = Options() 
chrome_options.add_argument('--proxy-server={}'.format(proxy.proxy)) 
driver = Chrome(chrome_options=chrome_options)

7、浏览器版本兼容性问题:

Selenium需要与特定版本的浏览器兼容才能正常工作。解决方法包括选择合适的浏览器驱动程序、升级Selenium和浏览器版本、以及使用多个分辨率进行测试等。

举个例子:

如果需要与Chrome浏览器75版兼容,可以下载对应的ChromeDriver驱动程序并指定路径:

from selenium.webdriver import Chrome 

driver_path = '/path/to/chromedriver' 
driver = Chrome(executable_path=driver_path) 

8、关键字冲突:

Selenium的函数名和变量名有可能与项目中的其他关键字冲突,导致编程异常。解决方法包括将Selenium函数封装到一个新的类中或者使用别名来避免命名冲突。

举个例子:

如果你的项目中已经定义了一个名为click()的函数,可以使用as关键字给Selenium的点击函数取个别名:

from selenium.webdriver import Chrome 
from selenium.webdriver.common.by import By 
from selenium.webdriver.common.keys import Keys 

# 定义别名,避免和项目中的click()函数冲突 
selenium_click = Chrome.find_element_by_link_text 

# 使用别名进行元素定位并单击 driver.get('https://www.example.com') 
link = selenium_click('click me') 
link.click()

9、多种操作连锁问题:

在某些场景下,需要进行多个操作才能完成一个测试用例。这可能会导致操作连锁问题,即后续操作依赖于前一个操作的成功。解决方法包括使用assert断言判断操作结果是否正确、在需要操作的元素加载完成后再进行操作、或者将多个操作封装到函数中,并使用try…except语句捕获异常。

下面是一个操作连锁问题的例子,我们需要在一个网站上搜索关键字“Python”并验证搜索结果是否符合预期:

from selenium.webdriver.common.by import By 

# 打开网页并搜索关键字 driver.get('https://www.example.com') 
search_box = driver.find_element(By.NAME, 'q') 
search_box.send_keys('Python') search_box.submit() 

# 检查搜索结果是否符合预期 
result_links = driver.find_elements(By.TAG_NAME, 'a') 
for link in result_links: 
    assert 'Python' in link.text

10、调试和日志记录问题:

Selenium在自动化测试过程中可能会出现各种异常和错误,需要进行调试和日志记录。解决方法包括使用Python内置的logging模块记录日志,以及在代码中增加调试断点。

举个例子:

可以使用Python内置的logging模块记录日志信息,如下所示:

import logging 

logging.basicConfig(filename='test.log', level=logging.DEBUG) 
logging.debug('This is a debug message') 
logging.info('This is an info message') 
logging.warning('This is a warning message')

在实际使用中,我们需要根据具体情况进行调整和优化。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

在这里插入图片描述

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!  

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

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

相关文章

[NLP] LLM---<训练中文LLama2(二)>扩充LLama2词表构建中文tokenization

使用SentencePiece的除了从0开始训练大模型的土豪和大公司外,大部分应该都是使用其为当前开源的大模型扩充词表,比如为LLama扩充通用中文词表(通用中文词表,或者 垂直领域词表)。 LLaMA 原生tokenizer词表中仅包含少量…

asp.net+sqlserver医院体检信息管理系统

一、源码描述 这是一款简洁十分美观的ASP.NETsqlserver源码,界面十分美观,功能也比较全面,比较适合 作为毕业设计、课程设计、使用,感兴趣的朋友可以下载看看哦 二、功能介绍 该源码功能十分的全面,具体介绍如下&…

PyTorch深度学习实战——基于ResNet模型实现猫狗分类

PyTorch深度学习实战——基于ResNet模型实现猫狗分类 0. 前言1. ResNet 架构2. 基于预训练 ResNet 模型实现猫狗分类相关链接 0. 前言 从 VGG11 到 VGG19,不同之处仅在于网络层数,一般来说,神经网络越深,它的准确率就越高。但并非…

Linux学习第12天:基于API函数的字符设备驱动开发:一字一符总见情

本节学习的内容主要为基于LinuxAPI函数的字符设备驱动的开发,还包括在驱动模块加载的时候如何自动创建设备节点。总结的脑图如下: 一、驱动原理 1.分配和释放设备号 申请设备号函数: int alloc_chrdev_region(dev_t *dev, unsigned basemin…

改进YOLOv5小目标检测:构建多尺度骨干和特征增强模块,提升小目标检测

构建多尺度骨干和特征增强模块,提升小目标检测 背景代码使用配置文件如下🔥🔥🔥 提升小目标检测,创新提升 🔥🔥🔥 测试在小目标数据集进行提点 👉👉👉: 新设计的创新想法,包含详细的代码和说明,具备有效的创新组合 🐤🐤🐤 1. 本文包含两个创新改…

SQL优化--count优化

select count(*) from tb_user ;在之前的测试中,我们发现,如果数据量很大,在执行count操作时,是非常耗时的。 MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个 数,效率很…

档案管理系统设计与实现

摘 要 近年来,随着企业彼此间的竞争日趋激烈,信息技术在企业的发展中占据着越来越重要的地位。在企业的运输生产中,档案已成为企业运输经营中不可或缺的一部分,为管理者进行管理决策和进行各种经营活动提供了重要的依据&#xf…

前后端分离--Vue的入门基础版

目录 一.前后端分离 二.Vue的简介 三.Vue的入门案例 四.Vue的生命周期 一.前后端分离 前后端分离是一种软件架构模式,将应用程序的前端(用户界面)和后端(数据处理和业务逻辑)独立开发、独立部署。在前后端分离的架…

【数据结构】AVL树的删除(解析有点东西哦)

文章目录 前言一、普通二叉搜索树的删除1. 删除结点的左右结点都不为空2. 删除结点的左结点为空,右节点不为空3. 删除结点的右结点为空,左节点不为空4. 删除结点的左右结点都不为空 二、AVL树的删除1. 删除结点,整棵树的高度不变化1.1 parent…

RISV-V架构的寄存器介绍

1、RISC-V的通用寄存器 (1)在编写汇编代码时,使用寄存器的ABI名字,一般不直接使用寄存器的编号; (2)x0-x31是用来做整形运算的寄存器,f0-f31是用来做浮点数运算的寄存器;…

傅里叶变换应用 (01/2):频域和相位

一、说明 我努力理解傅里叶变换,直到我将这个概念映射到现实世界的直觉上。这是一系列技术性越来越强的解释中的第一篇文章。我希望直觉也能帮助你! 二、傅里叶变换中频域简介 声音是一种机械波,是空气中的振动或其他介质。音符对应于波的频率…

【LeetCode75】第五十七题 电话号码的字母组合

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 给我们按下的按键,让我们返回对应按键可能产生的所有可能。 这是一道很经典的递归题,我们首先先拿一个数组把每个…

day45:C++ day5,运算符重载剩余部分、静态成员、继承

#include <iostream> #include <cstring> #define pi 3.14 using namespace std;class Shape { protected:double round;double area; public://无参构造Shape():round(40),area(100){cout<<"Shape::无参构造函数&#xff0c;默认周长为40&#xff0c;面…

C语言入门Day_21 函数的使用

目录 前言&#xff1a; 1.变量作用域 2.代码执行顺序 3.易错点 4.思维导图 前言&#xff1a; 我们是先定义函数&#xff0c;再调用函数。完成了函数的定义以后&#xff0c;我们就可以开始调用函数了&#xff0c;让我们来回顾一下&#xff1a; 调用函数分为两部分&#…

1131. 绝对值表达式的最大值

1131. 绝对值表达式的最大值 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;求方向一次遍历两度统计 参考代码&#xff1a;求方向一次遍历两度统计 原题链接&#xff1a; 1131. 绝对值表达式的最大值 https://leetcode.cn/problems/maximum-of-absolute-val…

网络安全深入学习第二课——热门框架漏洞(RCE—Thinkphp5.0.23 代码执行)

文章目录 一、什么是框架&#xff1f;二、导致框架漏洞原因二、使用步骤三、ThinkPHP介绍四、Thinkphp框架特征五、Thinkphp5.0.23 远程代码执行1、漏洞影响范围2、漏洞成因 六、POC数据包Windows下的Linux下的 七、漏洞手工复现1、先Burp抓包&#xff0c;把抓到的请求包发送到…

【AI语言大模型】文心一言功能使用介绍

一、前言 文心一言是一个知识增强的大语言模型,基于飞桨深度学习平台和文心知识增强大模型,持续从海量数据和大规模知识中融合学习具备知识增强、检索增强和对话增强的技术特色。 最近收到百度旗下产品【文心一言】的产品,抱着试一试的心态体验了一下,整体感觉:还行! 二…

自动化测试API【软件测试】

自动化测试 selenium 1. 为什么使用selenium&#xff1f; 开源免费支持多浏览器支持多系统支持多语言编程提供了丰富的web自动化测试API 2. API 查找页面元素 find Element() find Elements() 元素定位的方式 xpath selector 通常情况下&#xff0c;不需要手动来编写xpath…

Learn Prompt-经验法则

还记得我们在“基础用法”当中提到的三个经验法则吗&#xff1f; 尝试提示的多种表述以获得最佳结果使用清晰简短的提示&#xff0c;避免不必要的词语减少不精确的描述 现在经过了几页的学习&#xff0c;我认为是时候引入一些新的原则了。 3. 一个话题对应一个chat​ ChatG…

Kafka开篇

前言 从本篇开始对个人Kafka学习做一个总结, 目标有这么几个。 从概念架构角度, 对消息中间件形成概要认知;从使用角度, 掌握其常见用法;从性能角度, 探究其高性能实现机制; 消息中间件的用途 从消息生产和消费的角度, 平衡消费者和消费者的速率差。基于该点可以做到削峰填…