0

我有一个C# selenium/Appium项目需要在其中找到桌面应用程序窗口By.Xpath("").

这有效:

By.XPath("//*[@Name='ASDASD']");

但是,某些版本的应用程序的窗口名称为“ ASDasd”,这导致Xpath上面找不到窗口元素并且测试失败。

是否可以忽略@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 秒。

谢谢您的帮助!

问候

4

1 回答 1

0

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']"
于 2021-09-17T11:09:40.107 回答