我正在使用 XPath 编写一些 e2e(由于各种原因,我无法在我的项目上设置甜蜜的 ID)。然而,当通过 XPath 查找父元素并随后尝试在其中查找子元素时,Protractor 会忽略父元素并尝试在整个文档中查找它。
(在这种情况下,各个复选框共享相同的名称,但它们包含在可以充当父项的不同卡片中。)
我已经单独测试了 XPath 表达式,它们找到了我想要的元素,我还加入了 XPath 表达式,它们工作得很好,我不明白的是为什么在 Protractor 中运行它时不起作用.
该函数查找父元素
findEpCard(label:string) {
//return element(by.xpath('//ep-card//div[contains(@class, "ep-card-header")]//h4[text() = "'+label+'"]/../..'));
return element(by.xpath('//ep-card[.//h4[text() = "'+label+'"]]'));
}
这是通过搜索父卡找到复选框的函数
findCheckbox(parentCard: string, label: string) {
let card = this.findEpCard(parentCard)
return card.element(by.xpath('//ep-check-box[.//span[text()="'+label+'"]]'));
}
但是当调用它时
csKeyField = this.findCheckbox('Control Settings','Key Field');
它将找到 DOM 中的所有复选框。
通过加入 2 个 xpath 进行搜索效果非常好,但我试图避免它:
return element(by.xpath('//ep-card[.//h4[text() = "'+parentCard+'"]]//ep-check-box[.//span[text()="'+label+'"]]'));
谢谢!
最佳答案
你错过了下面xpath的标题中的.
,这里的.
表示从当前节点(即父节点)开始搜索元素。此处如果没有 .
,您的 xpath 会告诉浏览器从 HTML 开头开始搜索元素。
card.element(by.xpath('.//ep-check-box[.//span[text()="'+label+'"]]'));
关于javascript - 通过Xpath在另一个元素中查找一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55976117/