忽略大小写 Xpath @Name 属性 c# Selenium/Appium
Ignore case Xpath @Name attribute c# Selenium/Appium
我有一个 C# selenium/Appium
项目,我需要在其中找到一个桌面应用程序 window By.Xpath("").
这个有效:
By.XPath("//*[@Name='ASDASD']");
但是,某些应用程序版本的 window 名称为“ASDasd
”,这导致上面的 Xpath
找不到 window 元素和测试失败。
是否可以忽略 @Name
属性 的大小写,无论是 "ASDASD", "ASDasd"
还是其他?
我确实尝试使用 XPath 翻译功能,但我找不到元素,我想我做错了。
我尝试了什么:
By.XPath("//*[translate(name(),'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = 'asdasd']")
或
By.XPath("//*[translate(name(),'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'asdasd']")
或
By.XPath("//*[@Name='translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'asdasd'']")
或
By.XPath("//*[@Name='translate(asdasd,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')']")
也许还有一些其他变体,但我无法让它工作。
部分示例的格式可能无效。
虽然其他似乎有效但找不到该元素并且会超时。
更新:
感谢您的帮助,这有效:
By.XPath("//*[translate(@Name, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')='asdasd']");
但是,它以某种方式为测试增加了 60 秒,它似乎在寻找主要内容的地方之一停滞了 60 秒 window。
感谢您的帮助!
此致
name()
为您提供上下文节点的名称。在本例中 (//*
),是您当前正在查看的任何元素的名称。您打算写 @Name
,即恰好称为 Name
.
的 属性
By.XPath("//*[translate(@Name, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = 'asdasd']")
使用 translate()
很笨拙,当搜索字符串包含意外字符时会失败。
遗憾的是,XPath 1.0 中没有 lower-case()
函数。但是您可以借助宿主语言(例如 C#)解决此限制。
以下将动态创建一个不区分大小写地查找任意值的 XPath 表达式:
var searchValue = "asdasd";
var uc = searchValue.ToUpperInvariant();
var lc = searchValue.ToLowerInvariant();
var xpath = $"//*[translate(@Name, '{uc}', '{lc}') = '{lc}']";
// -> "//*[translate(@Name, 'ASDASD', 'asdasd') = 'asdasd']"
我有一个 C# selenium/Appium
项目,我需要在其中找到一个桌面应用程序 window By.Xpath("").
这个有效:
By.XPath("//*[@Name='ASDASD']");
但是,某些应用程序版本的 window 名称为“ASDasd
”,这导致上面的 Xpath
找不到 window 元素和测试失败。
是否可以忽略 @Name
属性 的大小写,无论是 "ASDASD", "ASDasd"
还是其他?
我确实尝试使用 XPath 翻译功能,但我找不到元素,我想我做错了。
我尝试了什么:
By.XPath("//*[translate(name(),'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = 'asdasd']")
或
By.XPath("//*[translate(name(),'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'asdasd']")
或
By.XPath("//*[@Name='translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 'asdasd'']")
或
By.XPath("//*[@Name='translate(asdasd,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')']")
也许还有一些其他变体,但我无法让它工作。
部分示例的格式可能无效。
虽然其他似乎有效但找不到该元素并且会超时。
更新: 感谢您的帮助,这有效:
By.XPath("//*[translate(@Name, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')='asdasd']");
但是,它以某种方式为测试增加了 60 秒,它似乎在寻找主要内容的地方之一停滞了 60 秒 window。
感谢您的帮助!
此致
name()
为您提供上下文节点的名称。在本例中 (//*
),是您当前正在查看的任何元素的名称。您打算写 @Name
,即恰好称为 Name
.
By.XPath("//*[translate(@Name, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = 'asdasd']")
使用 translate()
很笨拙,当搜索字符串包含意外字符时会失败。
遗憾的是,XPath 1.0 中没有 lower-case()
函数。但是您可以借助宿主语言(例如 C#)解决此限制。
以下将动态创建一个不区分大小写地查找任意值的 XPath 表达式:
var searchValue = "asdasd";
var uc = searchValue.ToUpperInvariant();
var lc = searchValue.ToLowerInvariant();
var xpath = $"//*[translate(@Name, '{uc}', '{lc}') = '{lc}']";
// -> "//*[translate(@Name, 'ASDASD', 'asdasd') = 'asdasd']"