如何使用XPath获取属性的值

11

我一直在使用Selenium WebDriver 进行测试,并且一直在寻找 XPath 代码来获取HTML元素属性的值,以便进行回归测试。但是我没有找到一个好的答案。

以下是我的示例HTML元素:

<div class="firstdiv" alt="testdiv"></div>

我想使用XPath获取"alt"属性的值。我有一个XPath,可以使用class属性找到div元素,它是:

//div[@class="firstdiv"]

现在,我正在寻找一段XPath代码来获取“alt”属性的值。假设我不知道“alt”属性的值是什么。

Now, 我正在寻找一段XPath代码来获取“alt”属性的值. 假设我不知道“alt”属性的值是什么。

3
使用Selenium无法做到这一点。Selenium期望XPath查询返回物理DOM元素。为什么getAttribute('alt')无法工作? - Arran
@Arran 因为当你运行远程Selenium(例如Browserstack)时,它需要很长时间:每个getAttribute都是+= 2 *延迟 - polkovnikov.ph
同意@polkovnikov.ph的观点,当运行远程Selenium时,您应该尽力使测试变得不那么啰嗦,但在这种情况下,除了进行两次调用-一次获取元素,一次从中获取属性,别无选择。 - Arran
@Arran,请看下面我的解决方案,只需一次调用。 - polkovnikov.ph
@polkovnikov.ph,如果您喜欢这种方式,那太好了! :) - Arran
@Arran 不是很好,但没有其他选择。就像使用HTML5拖放API一样:你必须为了Selenium最终能够工作而放弃代码质量。 - polkovnikov.ph
4个回答

18
你可以使用getAttribute()方法。
driver.findElement(By.xpath("//div[@class='firstdiv']")).getAttribute("alt");

感谢Richard的快速回复...然而,我的情况是我有这个应用程序,用户只需提供xpath,系统就会进行测试...但我想除了做两次调用之外没有其他方法...首先获取元素,然后获取属性。 - arn-arn

2
使用C#,.Net 4.5和Selenium 2.45。使用findElements将第一个div元素捕获到一个集合中。
var firstDivCollection = driver.findElements(By.XPath("//div[@class='firstdiv']"));

然后遍历集合。

        foreach (var div in firstDivCollection) {
            div.GetAttribute("alt");
        }

1

只需在浏览器中使用executeScript并执行XPath或querySelector/getAttribute。其他解决方案是错误的,因为如果有多个元素,则使用Selenium调用每个元素的getAttribute需要很长时间。

  var hrefsPromise = driver.executeScript(`
        var elements = document.querySelectorAll('div.firstdiv');
        elements = Array.prototype.slice.call(elements);
        return elements.map(function (element) {
              return element.getAttribute('alt');
        });
  `);

1
Selenium Xpath 只能返回元素。你需要传递执行 xpaths 并返回字符串的 javascript 函数给 selenium。
我不确定为什么他们这样做。Xpath 应该支持返回字符串。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接