web-dev-qa-db-fra.com

Obtenir TOUS les attributs d'un IWebElement avec Selenium WebDriver

Je veux extraire des informations du DOM avec Selenium. J'utilise le WebDriver C #.

En regardant l'interface IWebElement, vous pouvez facilement extraire un attribut donné. Cependant, j'aimerais extraire tous les attributs d'un élément sans connaître leur nom d'avance.

Il doit y avoir un moyen simple de le faire puisqu'il existe une méthode pour obtenir une valeur d'attribut si vous connaissez son nom.

Un exemple:

<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.

Espérons que je manque quelque chose d'évident.

Merci d'avance!

7
pansarshrek

La propriété .attributes en JavaScript renverra un tableau de tous les attributs d'un élément donné et de sa valeur.

Donc, ce que vous devrez faire, c'est d'abord obtenir une driver capable d'exécuter JavaScript:

IJavascriptExecutor javascriptDriver = (IJavaScriptExecutor)driver;

Maintenant, exécutez-le en:

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>;

L’idée de base de JavaScript est d’utiliser la propriété JavaScript attributes au sein de l’élément lui-même, puis d’extraire les informations dont nous avons besoin - le nom et la valeur de l’attribut. La propriété attributes, en réalité, extrait beaucoup d'informations sur chaque propriété individuelle, mais nous ne voulons que deux champs. Nous obtenons donc ces deux champs, les mettons dans un dictionnaire et WebDriver nous les analysera ensuite. (Il pourrait probablement être nettoyé un peu)

C'est maintenant une Dictionary et vous pouvez donc naviguer comme vous le souhaitez. La key de chaque paire sera le nom de l'attribut et la value de chaque paire sera la valeur de l'attribut.

Seulement testé cela avec quelques éléments disséminés sur le Web (ici, Google et quelques petites pages Web) et cela semble bien fonctionner.

12
Arran

Vous pouvez essayer ceci:

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

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

Cela vous donnera le code HTML de l'élément. À partir de là, vous pouvez analyser, comme suggéré par Arran

8
rotem
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"));
}
1
BREI

vous pouvez faire un FindElement (By.tag ("body")) pour renvoyer une liste de WebElements, puis analyser les résultats comme vous le suggérez.

0
madz

Vous pouvez essayer ceci:

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