如何在 Selenium WebDriver(Python)中查找包含特定文本的元素?

2025-01-13 08:53:00
admin
原创
109
摘要:问题描述:我正在尝试使用 Selenium 测试复杂的 JavaScript 接口(使用 Python 接口,并跨多个浏览器)。我有多个按钮,形式如下:<div>My Button</div> 我希望能够根据“我的按钮”(或不区分大小写、部分匹配,如“我的按钮”或“按钮”)搜索按钮。我...

问题描述:

我正在尝试使用 Selenium 测试复杂的 JavaScript 接口(使用 Python 接口,并跨多个浏览器)。我有多个按钮,形式如下:

<div>My Button</div>

我希望能够根据“我的按钮”(或不区分大小写、部分匹配,如“我的按钮”或“按钮”)搜索按钮。

我发现这非常困难,以至于我感觉我忽略了一些显而易见的东西。到目前为止,我所拥有的最好的东西是:

driver.find_elements_by_xpath('//div[contains(text(), "' + text + '")]')

但是,这是区分大小写的。我尝试过的另一件事是遍历页面上的所有 div,并检查 element.text 属性。但是,每次你都会得到以下形式的情况:

<div class="outer"><div class="inner">My Button</div></div>

div.outer 的文本也是“我的按钮”。为了解决这个问题,我尝试查看 div.outer 是否是 div.inner 的父元素,但我不知道该怎么做(element.get_element_by_xpath('..') 返回元素的父元素,但测试结果不等于 div.outer)。

此外,遍历页面上的所有元素似乎真的很慢,至少使用 Chrome webdriver 时是这样。

有想法吗?


我在这里询问(并回答)了一个更具体的版本:如何获取 Selenium WebDriver 中元素的文本,而不包括子元素文本?


解决方案 1:

请尝试以下操作:

driver.find_elements_by_xpath("//*[contains(text(), 'My Button')]")

解决方案 2:

在您提供的 HTML 中:

<div>My Button</div>

文本My ButtoninnerHTML并且周围没有空格,因此您可以轻松使用text()如下方式:

my_element = driver.find_element_by_xpath("//div[text()='My Button']")

注意text()选择上下文节点的所有文本节点子节点


带有前导/尾随空格的文本

如果相关文本开头包含空格:

<div>   My Button</div>

或者在最后:

<div>My Button   </div>

或者在两端:

<div> My Button </div>

在这种情况下,您有两个选择:

  • 您可以使用contains()函数确定第一个参数字符串是否包含第二个参数字符串并返回布尔值 true 或 false,如下所示:

my_element = driver.find_element_by_xpath("//div[contains(., 'My Button')]")
  • 您可以使用normalize-space()函数从字符串中去除前导和尾随空格,用单个空格替换空格字符序列,并返回结果字符串,如下所示:

driver.find_element_by_xpath("//div[normalize-space()='My Button']")

变量文本的 XPath 表达式

如果文本是变量,则可以使用:

foo= "foo_bar"
my_element = driver.find_element_by_xpath("//div[.='" + foo + "']")

解决方案 3:

您可以尝试如下 XPath 表达式:

'//div[contains(text(), "{0}") and @class="inner"]'.format(text)

解决方案 4:

// 将查找任何 HTML 标签。如果某些文本对于按钮和 div 标签来说很常见,并且 // 是类别,它将无法按预期工作。如果您需要选择任何特定的,那么您可以通过声明 HTML 元素标签来获取它。例如:

driver.find_element_by_xpath("//div[contains(text(),'Add User')]")
driver.find_element_by_xpath("//button[contains(text(),'Add User')]")

解决方案 5:

您还可以将它与页面对象模式一起使用,例如:

试试这个代码:

@FindBy(xpath = "//*[contains(text(), 'Best Choice')]")
WebElement buttonBestChoice;

解决方案 6:

有趣的是,几乎所有的答案都围绕 XPath 的功能,而忽略了它区分大小写的contains()事实- 与 OP 的要求相反。

如果您需要不区分大小写,可以使用 XPath 1.0 (当代浏览器支持的版本)来实现,尽管它不太好用 - 通过使用translate()函数。它使用转换表将源字符替换为其所需的形式。

构建一个全大写字母的表将有效地将节点的文本转换为其 lower() 形式 - 允许不区分大小写的匹配(这里只是特权)

[
  contains(
    translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),
    'my button'
  )
]
# will match a source text like "mY bUTTon"

完整的 Python 调用:

driver.find_elements_by_xpath("//*[contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZЙ', 'abcdefghijklmnopqrstuvwxyzй'), 'my button')]")

当然,这种方法也有缺点 - 如上所述,它只适用于拉丁文本;如果你想涵盖 Unicode 字符 - 你必须将它们添加到翻译表中。我在上面的示例中已经这样做了 - 最后一个字符是西里尔符号"Й"


如果我们生活在一个浏览器支持 XPath 2.0 及更高版本的世界*(

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用