使用 getAttribute 获取本机上下文中网络元素的 class 名称

Using getAttribute to get the class name of a webelement in Native context

浏览了 getAttribute 的 java 文档。无法理解提到的观点:

Finally, the following commonly mis-capitalized attribute/property names are evaluated as expected: "class" "readonly"

有人可以确认 webElement.getAttribute("class") 是否应该 return 元素的 class 名称吗?

编辑:我自己尝试这个

System.out.println("element " + webElement.getAttribute("class")); 

我得到

org.openqa.selenium.NoSuchElementException

注意 : 该元素确实存在于屏幕上,因为我可以在该元素上成功执行操作 :

webElement.click(); //runs successfully

代码:

WebElement webElement = <findElement using some locator strategy>; 
System.out.println("element " + webElement.getAttribute("class"));

根据 this answer,是的,你做对了。您的 org.openqa.selenium.NoSuchElementException 被抛出,因为 selenium 无法找到元素本身。

您发布的关于 webElement.click() 实际工作的旁注很遗憾没有包含在您发布的代码中。由于它不是实际问题的一部分,因此我不做任何处理就留下这个答案。

所以问题的答案在 appium/java-client 的问题列表中的 GitHub 上由 @SergeyTikhomirov 回答。对此的简单解决方案是访问类名 属性,如下所示:

webElement.getAttribute("className")); //instead of 'class' as mentioned in the doc

方法核心实现在这里AndroidElement

public String getStringAttribute(final String attr)
  throws UiObjectNotFoundException, NoAttributeFoundException {
String res;
if (attr.equals("name")) {
  res = getContentDesc();
  if (res.equals("")) {
    res = getText();
  }
} else if (attr.equals("contentDescription")) {
  res = getContentDesc();
} else if (attr.equals("text")) {
  res = getText();
} else if (attr.equals("className")) {
  res = getClassName();
} else if (attr.equals("resourceId")) {
  res = getResourceId();
} else {
  throw new NoAttributeFoundException(attr);
}
return res;

}