WinAppDriver-使用文本定位元素

时间:2019-12-19 17:59:11

标签: selenium xpath winappdriver

我正在自动化一个简单的Windows窗体应用程序,并且尝试使用其内部文本查找WindowsElement。我的WindowsElement看起来像这样:

ControlType = DataItem
    Name = 'Identifier'
    ValuePattern.Value = 'Text'
    LegacyIAccessiblePattern.Value = 'Text'
    AutomationId = blank

该元素除NameControlType(我在XPath中使用)和ValuePattern.Value(包含我正在搜索的所需文本)之外,没有其他属性。我想使用'Text'ValuePattern.Value基于LegacyIAccessiblePattern.Value定位元素,但是我似乎无法编写成功使用这些属性的XPath。我无法使用@Name来定位元素,因为其他几个元素共享相同的@Name属性值。 Text是唯一的唯一属性。

在Selenium WebDriver中,我可以这样通过文本定位元素:

driver.FindElement(By.XPath("//*[text()='Text']"));

在Appium中,我可以使用它:

driver.FindElement(By.XPath("//*[@text='Text']")

在WinAppDriver中,我正在尝试:

driver.FindElementByXPath("//DataItem[text()='Text']");

我也尝试过:

driver.FindElementByXPath("//DataItem[@ValuePattern.Value='Text']");

这两个都抛出NoSuchElementException。但是,我能够在WebDriverWait上成功调用TextToBePresentInElement,并且可以正常工作:

// my locator
private WindowsElement IdentifierSearchResult => Driver.FindElementByXPath("//DataItem[@Name='Identifier']");

// webdriverwait using the above locator, wait for 'Text' to be present in this element.
new WebDriverWait(Driver, TimeSpan.FromSeconds(20)).Until(SeleniumExtras.WaitHelpers.ExpectedConditions.TextToBePresentInElement(IdentifierSearchResult, 'Text'));

这也可以打印正确的文本:

var elements = Driver.FindElementsByXPath("//DataItem[@Name='Identifier']");
var text = elements.First().Text;

但是,这只是一个调试场景,在该场景中,我正在获取列表,并打印第一个列表的文本-这仅仅是测试,以验证元素具有有效的.Text属性。我无法在最终代码中使用此定位器,因为无法保证它会选择正确的元素。

我环顾了WinAppDriver存储库示例,但实际上找不到任何使用文本的东西-每个人都使用@Name@AutomationId-我的元素名称不是唯一的,并且具有没有自动化ID,因此这对我不起作用。

我知道我可以使用LINQ来解决此问题,

var elements = driver.FindElementsByXPath("//DataItem[@Name='Identifier']");
var elementToClick = elements.FirstOrDefault(e => e.Text == 'Text');

但是,这似乎是一个棘手的解决方法,如果可能的话,我想避免这种情况。

如何使用元素的文本查找元素?最好使用//DataItem[@Text='Text']之类的东西(我也尝试过,顺便说一句),在这里我可以将'Text'作为参数传递。

1 个答案:

答案 0 :(得分:0)

在使用菜单项时,我遇到了同样的问题,首先,我使用了foreach循环来检查文本值。后来我将其重构为别致的LINQ表达式。 但是我相信没有办法解决这个问题,您必须使用循环或LINQ来解决。