一尘不染

使用Selenium WebDriver从IWebElement获取所有属性

selenium

我想使用Selenium从DOM中提取一些信息。我正在使用C#WebDriver。

查看IWebElement接口,您可以轻松提取给定的属性。但是,我想提取一个元素的所有属性而无需事先知道它们的名称。

必须有一些简单的方法来执行此操作,因为如果您知道属性名称,则可以使用一种方法来获取属性值。

一个例子:

<button id="myButton" ng-click="blabla()" ng-show="showMyButton" 
     some-other-attribute="foo.bar" />



IWebElement element = driver.FindElement(By.Id("myButton"));
Dictionary<string, string> attributes = new Dictionary<string, string>();
// ???????
// Profit.

希望我缺少明显的东西。

提前致谢!


阅读 1250

收藏
2020-06-26

共1个答案

一尘不染

.attributesJavaScript中的属性将返回给定元素具有的所有属性及其值的数组。

因此,您需要做的是首先获得一个driver具有运行JavaScript功能的功能:

IJavascriptExecutor javascriptDriver = (IJavaScriptExecutor)driver;

现在,通过以下方式执行它:

Dictionary<string, object> attributes = javascriptDriver.ExecuteScript("var items = {}; for (index = 0; index < arguments[0].attributes.length; ++index) { items[arguments[0].attributes[index].name] = arguments[0].attributes[index].value }; return items;", element) as Dictionary<string, object>;

JavaScript的思想是attributes在元素本身内使用JavaScript 属性,然后提取我们需要的信息-
属性的名称和值。attributes实际上,该属性可获取有关每个属性的大量信息,但我们只需要两个字段。因此,我们得到了这两个字段,将它们放入字典中,然后WebDriver会将其解析回给我们。(它可能会被清理一点)

现在是a Dictionary,因此您可以随意循环浏览。的key每对将是 名称 属性的,并且value每对将是 的属性。

仅使用在网络上点缀的一些元素(这里是Google和一些小的网页)进行了测试,它似乎运行良好。

2020-06-26