【Selenium使用误区】Iframe元素定位失败:避免误提GitHub Issue的技巧

简介: 本文分享了作者在使用Selenium进行UI自动化测试时遇到的一个常见问题:在模拟登录163邮箱的过程中,元素定位失败,原因是没有正确地定位到iframe内的元素。文章通过分析问题原因、提供解决方案和附录代码,指导读者如何避免类似的错误,并强调了在UI自动化测试中准确定位页面元素的重要性。

一、前世因果

自从题主在闲鱼售卖技能至今,已有十几二十的访客来付费寻求答案,本人也是不甚荣幸、受宠若惊,但是有一点却不那么美丽,对于寻求答案的人来说是物美价廉,但是对于题主却是损失,甚至是亏本;不论如何,总归是有点价值,能被有需要的人找到,从而印证自己的技能是有价值而被需要,很不错。

二、种豆得豆

题主最擅长的是python/java自动化测试领域,自然是在行自动化,但是也接到不少其他领域的需求;譬如:matplotlib、flask、django、numpy、nltk等等方面,当然有些学习成本低,可以应急处理;有时候关于web开发就有点捉襟见肘,每次评估需求的时候,都要搭建环境,而这个成本就是不计费的;所以有些雇主不是很明白,好像看着我随便捣鼓两下就成功了,然后钱就进了口袋,殊不知题主先在本地演练过或者提前做好了各种功课,才有的结果。

三、直切正题

好不容易有解决自动化测试问题的单子,不管是接口还是UI自动化,我都没上面的烦恼;因为开发环境是现成的,但是被测环境却是五花八门。

  • 需求
UI自动化:模拟登录163邮箱,为什么每次打开了浏览器,但是却不能输入account/passwd?
  • 分析1
既然已经到了打开浏览器的地步,那么不能输入账号操作?无非就是找不到元素呗,在当我看到她的代码时,我整个人都不淡定了。
  • 代码1:测试用例类
import unittest
from login import PageLogin

class TestLogin(PageLogin):

    def testcaselogin(self):
        username = "XXXXX"
        PWD  = "XXXXXX"

    def page_login(self,username,password):
        username = "XXXXXX"
        PWD  = "xxxxxXX"
        self.page_input_username(username)
        self.page_input_password(PWD)
        self.page_click_login_btn()
  • 代码2:封装的页面操作类
from base.basepage import Base

class PageLogin(Base):

    #登录
    def page_click_login_link(self):
        self.base_click(page.login_link)

    #输入用户名
    def page_input_username(self,email):
        self.base_input(page.login_username,email)
        login_username = By.name,"email"

    #输入密码
    def page_input_password(self,password):
        self.base_input(page.login_password,password)
        login_pwd = By.name,"password"

    #点击登录
    def page_click_login_btn(self):
        self.base_click(page.login_btn)
        login_btn = By.id,"dologin"
  • 分析2

从以上代码层面来讲,一个测试用例执行(远程看了才知道她用的是vc编辑器),当然只能打开浏览器呢,
因为它是继承了PageLogin类,里面有打开地址操作,而在当前测试类是没有执行打开操作的,但是它没执行帐号操作是因为第二个原因;
原因就是:page.login_password,这个元素还被注释了,整个测试用例根本可不能找到元素进行操作;

  • PO设计模式实现的UI自动化测试框架,感觉她的代码是东拼西凑的,而且还没有完全理解这个设计模式。

四、解决到底

题主收人钱财与人消灾的使命,解决这类问题,自问还是手到擒来!

  • 事实证明自己是错的,尽管想法没问题,但是方向可能跑偏了。
page的元素我给她补齐了,好在这些页面元素很简单,都是有id或者name的。
只是因为她使用了selenium4的版本,这让我一度怀疑它是有问题的,题主也一直定位不到元素?
  • 思考:都是id或者name没有理由定位不到元素,肯定是哪里疏忽了。
我也有想过frame或iframe标签,但是第一次在F12的源码搜索下没有结果?

让我怀疑的selenium4,回到家立马用selenium3版本试了一下,大失所望!最终还是确认还是iframe的问题,打开浏览器输入目标地址,它没有指定到iframe这个标签上操作元素,直接操作是无效的,导致代码一直报错找不到页面元素超时。

4.1、附录代码
从提出问题到确认问题、找到问题、解决问题,花的时间成本着实有点大,因为只收了9.9元。
  • 改造后的测试类
import unittest

from page.login import PageLogin


class TestLogin(unittest.TestCase):


    @classmethod
    def setUpClass(cls):
        cls.PL = PageLogin()


    def test_page_login(self):
        username = "XXXXXX"
        PWD  = "XXXXXXXX"
        self.PL.switch_iframe()
        self.PL.page_input_username(username)
        self.PL.page_input_password(PWD  )
        self.PL.page_click_login_btn()

if __name__ == '__main__':
    unittest.main()
  • 增加基础类的方法
def switch_iframe(self):
    self.driver.switch_to.frame(self.driver.find_elements(By.TAG_NAME, "iframe")[0])
    # self.driver.switch_to.frame(self.base_find_element((By.XPATH,"//iframe[starts-with(@id,'x-URS-iframe')]")))
    # self.driver.switch_to.frame(0)
    # self.driver.switch_to.frame("id or name")

五、总结

所以不要夜郎自大,戒骄戒躁,不要粗心,原本真的是几分钟可以解决的问题,而要浪费1整天。对于UI自动化的问题无非就是解决定位页面元素的问题,至于怎么想的:这个元素怎么找到,如何写最好看的xpath表达式等等,这个就需要勤加练习。

相关文章
|
6月前
|
Web App开发 XML 前端开发
Selenium安装及八大元素定位方法&介绍及使用教程
Selenium是一个支持多种编程语言的自动化测试工具,用于Web应用的测试。它提供了多种元素定位策略,包括ID、Name、Class Name、Tag Name、Link Text、Partial Link Text、CSS Selector和XPath。安装Selenium需先确保Python和pip已安装,然后通过pip安装库,并下载对应浏览器的WebDriver。验证安装成功后,可通过编写简单脚本来打开网页并打印标题。注意WebDriver版本应与浏览器兼容,且可能需要额外的依赖包。文章还介绍了XPath的两种类型及其区别,推荐使用相对XPath以提高稳定性。
209 0
|
6月前
|
数据采集 前端开发 Java
《手把手教你》系列技巧篇(十一)-java+ selenium自动化测试-元素定位大法之By tag name(详细教程)
【4月更文挑战第3天】该文介绍了Selenium自动化测试中元素定位方法的By ClassName,强调了解前端基础知识对Web自动化测试的重要性。文章提到,当元素没有特定属性值(如ID、类名或名称)时,可以使用tagName定位器,例如在查找表格数据或验证链接数量时。但要注意,如果仅通过tagName定位,可能会导致选取多个元素,建议结合其他属性以更精确地定位单个元素。文中还提供了Java代码示例,展示了如何使用tagName定位元素并执行自动化测试。
120 6
|
6月前
|
前端开发 Java 测试技术
《手把手教你》系列技巧篇(十三)-java+ selenium自动化测试-元素定位大法之By partial link text(详细教程)
【4月更文挑战第5天】本文介绍了Partial Link Text,这是一种用于网页自动化测试的方法,允许部分匹配超链接文本,尤其适用于长链接不便完全输入的情况。为确保准确性,建议选择具有唯一性的字符组合。文章列举了8种常用的定位方法,包括id、name、class name等,并重点讲解了partial link text。实战部分展示了如何通过 PartialLinkText 在百度首页找到并点击“打哭伊藤!孙颖莎:过瘾”这一热搜链接的代码示例。
100 2
|
6月前
|
Web App开发 前端开发 Java
《手把手教你》系列技巧篇(九)-java+ selenium自动化测试-元素定位大法之By name(详细教程)
【4月更文挑战第1天】 这篇教程介绍了如何使用Selenium Webdriver通过name属性来定位网页元素,作为系列教程的一部分,之前讲解了id定位,后续还会有其他六种定位方法。文中以百度搜索为例,详细说明了定位搜索框(name="wd")并输入关键词“北京宏哥”的步骤,包括手动操作流程、编写自动化脚本以及代码实现。此外,还提供了查看和理解Selenium源码的方法,强调了`open implementation`选项用于查看方法的具体实现。整个过程旨在帮助读者学习Selenium的元素定位,并实践自动化测试。
122 0
|
6月前
|
前端开发 Java 测试技术
《手把手教你》系列技巧篇(十二)-java+ selenium自动化测试-元素定位大法之By link text(详细教程)
【4月更文挑战第4天】本文介绍了link text在自动化测试中的应用。Link text是指网页中链接的文字描述,点击可跳转至其他页面。文章列举了8种常用的定位方法,其中着重讲解了link text定位,并通过实例展示了如何使用Java代码实现点击百度首页的“奥运奖牌榜 最新排名”链接,进入相应页面。如果link text不准确,则无法定位到元素,这说明linkText是精准匹配,而非模糊匹配。文章还提到了partial link text作为link text的模糊匹配版本,将在后续内容中介绍。
113 4
|
6月前
|
数据采集 前端开发 JavaScript
《手把手教你》系列技巧篇(十)-java+ selenium自动化测试-元素定位大法之By class name(详细教程)
【4月更文挑战第2天】该文介绍了WebDriver的元素定位方法,重点讲解了By ClassName。作者强调理解前端基础知识对自动化测试的重要性,并列举了8种定位方法,包括id、name、class name、tag name等。文中以百度搜索为例,展示了如何使用class name进行定位,并提供了相关Java代码。在实践中,注意class name含有空格时会导致定位失败的问题。
106 0
|
6月前
|
XML 前端开发 Java
《手把手教你》系列技巧篇(十四)-java+ selenium自动化测试-元素定位大法之By xpath上卷(详细教程)
【4月更文挑战第6天】按宏哥计划,本文继续介绍WebDriver关于元素定位大法,这篇介绍定位倒数二个方法:By xpath。xpath 的定位方法, 非常强大。使用这种方法几乎可以定位到页面上的任意元素。xpath 是XML Path的简称, 由于HTML文档本身就是一个标准的XML页面,所以我们可以使用Xpath 的用法来定位页面元素。XPath 是XML 和Path的缩写,主要用于xml文档中选择文档中节点。基于XML树状文档结构,XPath语言可以用在整棵树中寻找指定的节点。
98 0
|
3月前
|
XML 前端开发 JavaScript
[selenium]元素定位
[selenium]元素定位
|
4月前
|
数据采集 前端开发 测试技术
【Python】已解决:(最新版selenium框架元素定位报错)NameError: name ‘By’ is not defined
【Python】已解决:(最新版selenium框架元素定位报错)NameError: name ‘By’ is not defined
98 0
|
6月前
|
JavaScript 前端开发 Java
《手把手教你》系列技巧篇(四十九)-java+ selenium自动化测试-隐藏元素定位与操作(详解教程)
【5月更文挑战第13天】本文主要讨论了在Selenium自动化测试中如何处理前端隐藏元素的问题。隐藏元素通常是通过`type="hidden"`或`style="display: none;"`属性实现的,它们在页面上不可见,但仍然存在于HTML代码中。Selenium可以定位到这些隐藏元素,但无法直接进行点击、输入等操作,会报错“ElementNotInteractableException”。
109 3