忽略大小写 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']"