【问题标题】:Finding an element in another element by Xpath通过 Xpath 在另一个元素中查找一个元素
【发布时间】:2019-05-06 09:52:57
【问题描述】:

我正在使用 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+'"]]'));

谢谢!

【问题讨论】:

    标签: javascript protractor webdriver


    【解决方案1】:

    你在following xpath的标题处错过了.,这里的.表示搜索元素从当前节点开始,即父节点。如果没有.,您的 xpath 会告诉浏览器从 HTML 的开头开始搜索元素。

    card.element(by.xpath('.//ep-check-box[.//span[text()="'+label+'"]]'));

    【讨论】:

    • 这个 XPath 并没有像您认为的那样做。 Selenium 并不完全符合 XPath 规范,它不会将 // 视为后代或自我。相反,它搜索整个 DOM。所以你真正在做的是//span[text()="'+label+'"]。您将需要显式更改 // 也 descendant-or-self:: 以获得您认为您正在获得的行为
    猜你喜欢
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 2020-06-11
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    相关资源
    最近更新 更多