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!
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.
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
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"));
}
vous pouvez faire un FindElement (By.tag ("body")) pour renvoyer une liste de WebElements, puis analyser les résultats comme vous le suggérez.
Vous pouvez essayer ceci:
Actions newTab = new Actions(web driver);
newTab.ContextClick(element).SendKeys(Keys.ArrowDown).SendKeys(Keys.ArrowDown).SendKeys(Keys.Return).Build().Perform();