À l'aide de SeleniumDriver d'extraire toutes les lignes et les colonnes étant donné un élément de tableau
Je suis grattant une table qui va finalement être exportés en format CSV. Il y a plusieurs cas, j'ai peut-être besoin à considérer, tels que des tableaux imbriqués, s'étend sur des lignes ou des cellules, etc. mais pour l'instant je vais juste ignorer ces cas et de les assumer, j'ai une table très très simple. Par "simple", je veux dire, nous avons juste les lignes et les cellules, éventuellement, à une inégalité dans le nombre de cellules par ligne, mais c'est encore assez basique dans la structure.
<table>
<tr>
<td>text </td>
<td>text </td>
</tr>
<tr>
<td>text </td>
</tr>
</table>
Mon approche est de simplement parcourir les lignes et les colonnes
String[] rowTxt;
WebElement table = driver.findElement(By.xpath(someLocator));
for (WebElement rowElmt : table.findElements(By.tagName("tr")))
{
List<WebElement> cols = rowElmt.findElements(By.tagName("td"));
rowTxt = new String[cols.size()];
for (int i = 0; i < rowTxt.length; i++)
{
rowTxt[i] = cols.get(i).getText();
}
}
Cependant, c'est assez lent. Pour un fichier CSV avec 218 lignes (ce qui signifie, ma table a 218 lignes), chaque ligne ayant pas plus de 5 colonnes, il a pris 45 secondes à gratter de la table.
J'avais essayé d'éviter une itération sur chaque cellule à l'aide de getText
sur l'élément de ligne en espérant que la sortie serait délimité par quelque chose, mais il n'était pas.
Est-il un meilleur moyen de gratter un tableau?
- Sinon, j'ai peut envisager l'utilisation de sélénium pour obtenir le code source de la page, et ensuite utiliser Jsoup pour faire l'analyse HTML, car j'ai bien aimé Jsoup de la performance.
Vous devez vous connecter pour publier un commentaire.
Plutôt que d'utiliser le sélénium pour parser le HTML, j'utilise Jsoup. Alors que le Sélénium fournit des fonctionnalités pour voyager à travers une table, Jsoup est beaucoup plus efficace. J'ai décidé d'utiliser le Sélénium seulement de la page web de l'automatisation, et de déléguer toutes les tâches analyse de Jsoup.
Mon approche est la suivante
Le code que j'ai fini par écrire était très semblable à du sélénium version
Le Sélénium analyseur prend 5 minutes pour lire un 1000 ligne de la table, tandis que le Jsoup analyseur prend moins de 10 secondes. Alors que je n'ai pas passer beaucoup de temps sur le benchmarking, je suis assez satisfait des résultats.
Le plus certainement est lente, peu importe si vous utilisez
xpath
,id
oucss
à faire de votre emplacement. Cela dit, si vous utilisez l'pageObject
modèle, vous pourriez faire usage de la@CacheLookup
annotation. À partir de la source:J'ai fait un test à l'aide de la table de 100 lignes et 6 colonnes, le test est interrogée sur le texte de chaque et tous les td de l'élément. Sans le
@CacheLookup
le temps (élément a été localisé parXPath
comme dans votre cas) env. 40sec. À l'aide de recherche dans le cache, elle est tombée à environ. 20sec, mais il est encore trop.De toute façon, si vous perdez le firefox pilote et vous pouvez exécuter des tests sans tête (à l'aide de interface htmlunit), la vitesse permettrait d'augmenter de façon drastique. Exécutant le même test sans tête, les temps étaient entre 100-200ms, de sorte qu'il pourrait même être plus rapide que
Jsoup
.Vous pouvez vérifier/tester mon code de test ici.
Je suis en utilisant HtmlAgilityPack installé en tant que Nuget pour analyser les dynamiques des tables html. ses très rapide et comme par cette réponse vous pouvez interroger les résultats à l'aide de linq. J'ai utilisé ceci pour stocker le résultat comme un DataTable. Voici les publics de la méthode d'extension de la classe:-
Le code html de l'objet de données est simplement une extension de dictionnaire:-
IWebdriverCore pilote est un wrapper sur IWebDriver ou IRemoteWebdriver qui expose l'une de ces interfaces comme une propriété en lecture seule, mais vous pourriez tout simplement la remplacer avec IWebDriver.
HtmlAttributes est statique lass holding const valeurs communes pour les attributs html pour économiser sur les fautes de frappe lorsque l'on se réfère à des éléments html/attributs/tags etc. dans le code c#: -
...
}
et SetPrimaryKey est une extension de la DataTable qui permet le réglage facile de la clé primaire d'une table de données:-
J'ai trouvé que c'était assez performant - < 2 ms pour analyser un 30*80 table, et son un doddle à utiliser.