使用webdriverio定位显示的元素



在Ionic框架中开发时,生成的html有时会包含重复的DOM元素,其中除了一个元素树之外的所有元素都用class="离子页隐藏";在最高级别。

当使用webdriverio尝试在该树中查找元素时,它会发现重复的元素。由于ion页面隐藏类位于树的顶部,而不是元素本身,我们如何使用Xpath仅定位显示的元素。

我想不出用第二个条件修改XPath选择器的任何方法,因为元素完全相同!

因此,我尝试使用webdriverioisDisplayed((函数:

get openHamburgerMenu()         { return Utils.visibleElement($$("//ion-button[@name='button-open-menu']")); }

其中Utils函数为:

async visibleElement(elementArray) {
let returnElement;
elementArray.forEach(element => {
if (element.isDisplayed()) {
returnElement = element;
}
});
return returnElement;
}

但是没有元素被传递到函数中。在chrome浏览器中,我可以看到两个匹配xpath//ion按钮[@name='button-open-menu']的按钮。我需要一个不在离子页隐藏块!

树看起来像这样:

家庭应用程序[1]/ion标题/ion工具栏/ion按钮[1]/ion按钮家庭应用程序[2]/离子头/离子工具栏/离子按钮[1]/离子按钮

家庭应用程序[2]恰好有隐藏的离子页面类。

我认为应该可以使用祖先来识别匹配xpath的两个元素中的哪一个,具有该类的第四级祖先?但在与xpath合作的第一天,我就太力不从心了。。。

快速且肮脏

使用Xpath:可以实现所需的结果

//app-for-homes[1]/ion-header/ion-toolbar/ion-buttons/ion-button[@name='button-open-menu']

但是,这只适用于已知元素出现顺序的情况。

更好的答案

当您正好有一个未隐藏的元素时,Xpath允许您查看元素祖先,只要您想确定隐藏类的存在/不存在。在这种情况下,我们首先要找到家庭的祖先应用程序,该应用程序不包含离子页面隐藏类:

//app-for-homes[not(contains(@class,'ion-page-hidden'))]

然后简单地将路径的剩余部分附加到所需元素。完整答案=

//app-for-homes[not(contains(@class,'ion-page-hidden'))]/ion-header/ion-toolbar/ion-buttons/ion-button[@name='button-open-menu']