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

时间:2014-02-10 15:58:47

标签: c# selenium selenium-webdriver

我想用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.

希望我错过了一些明显的东西。

提前致谢!

6 个答案:

答案 0 :(得分:12)

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

所以你需要做的是首先得到一个能够运行JavaScript的driver

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背后的想法是在元素本身中使用JavaScript attributes属性,然后提取我们需要的信息 - 属性的名称和值。实际上,attributes属性会提取有关每个属性的大量信息,但我们只需要两个字段。所以我们得到这两个字段,将它们放入字典中,然后WebDriver将它解析回给我们。 (它可能会被清理一下)

它现在是Dictionary,因此您可以随心所欲地循环播放。每对key将是属性的名称,每对的value将是属性的。< / p>

只有在网络上点缀了一些元素(此处为Google,以及一些小网页)才对其进行测试,并且它似乎运行良好。

答案 1 :(得分:8)

你可以试试这个:

IWebElement element = driver.FindElement(By.Id("myButton"));

string elementHtml = element.GetAttribute("outerHTML");

这将为您提供元素的html。从这里开始,您可以解析它,正如Arran建议的那样

答案 2 :(得分:1)

List<IWebElement> el = new List<IWebElement>(); el.AddRange(driver.FindElements(By.CssSelector("*")));

List<string> ag= new List<string>();
for (int b = 0; b < el.Count; b++)
{                    
    ag.Add(el[b].GetAttribute("outerHTML"));
}

答案 3 :(得分:0)

你可以做一个FindElement(By.tag(“body”))来返回一个WebElements列表,然后按照你的建议解析结果。

答案 4 :(得分:0)

你可以试试这个:

Actions newTab = new Actions(web driver);
newTab.ContextClick(element).SendKeys(Keys.ArrowDown).SendKeys(Keys.ArrowDown).SendKeys(Keys.Return).Build().Perform();

答案 5 :(得分:0)

我已经根据第一个答案创建了WebDriver Extension

public static List<string> GetElementAttributes(this RemoteWebDriver driver, IWebElement element)
{
    IJavaScriptExecutor ex = driver;
    var attributesAndValues = (Dictionary<string, object>)ex.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);
    var attributes = attributesAndValues.Keys.ToList();
    return attributes;
}