Sélénium - Recherche pour l'Élément Avec la Classe et le Texte
J'ai le code suivant qui sera à la recherche d'un élément donné, avec un nom de classe et le texte jusqu'à trouvé ou s'il expire. Je n'aime pas le fait qu'il est dans une boucle ouverte pendant 30 secondes tout en returnElement == null. Est-il un moyen plus efficace de faire cela? Remarque: Il ne peut pas trouver l'élément basé uniquement sur le texte.
#region FindAndWaitForElementListWithClassAndText
public static IWebElement FindAndWaitForElementWithClassAndText(IWebDriver driver, string className, string text, int timeout = 30)
{
if (driver == null)
throw new ApplicationException("No Selenium Driver defined, cannot continue.");
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeout));
IWebElement returnElement = null;
wait.Until(a => driver.FindElements(By.ClassName(className)));
//Starts task that times out after specified TIMEOUT_MILLIS
var tokenSource = new CancellationTokenSource();
CancellationToken token = tokenSource.Token;
var task = Task.Factory.StartNew(() => searchForElementWtihClassAndText(driver, className, text), token);
if(!task.Wait(TIMEOUT_MILLIS, token))
{
LoggerHelper.ErrorFormat("Could not find element with class and text: {0} :: {1}", className, text);
returnElement = null;
}
returnElement = task.Result;
return returnElement;
}
#endregion
private static IWebElement searchForElementWtihClassAndText(IWebDriver driver, String className, String text)
{
IWebElement returnElement = null;
while (returnElement == null)
{
var theList = driver.FindElements(By.ClassName(className));
if (theList != null && theList.Count > 0)
{
foreach (IWebElement el in theList)
{
if (el.Text.Equals(text, StringComparison.OrdinalIgnoreCase))
{
returnElement = el;
LoggerHelper.InfoFormat("Found Class Name and Text: {0} /{1}", className, text);
}
}
}
}
return returnElement;
}
Voici un exemple d'élément:
<div class="smtListItem smtMessageItem">
<!-- ngIf: message.SentItem -->
<!-- ngIf: !message.SentItem -->
<span class="smtListName ng-binding ng-
scope" data-ng if=
"!message.SentItem">user08 EIGHT</span>
<!-- end ngIf: !message.SentItem -->
...
</div>
- Voulez-vous dire un élément avec un nom de classe spécifique, et le texte? pouvez-vous me donner des extrait de code html?
- Bien sûr, j'ai ajouté un exemple d'élément.
- Le principal problème ici est que vous n'utilisez pas le
WebDriverWait
correctement. Il peut prendre toute une prédicat si vous le souhaitez. Donc @Saifur la réponse ci-dessous serait bien travailler. Vous avez environ 20 lignes de répétitions il.,
Vous devez vous connecter pour publier un commentaire.
Vous pouvez toujours écrire un
xpath
pour trouver l'élément et de vérifier si ce qui existe.De haut niveau de la mise en œuvre peut ressembler à ceci
By @by = By.XPath("//div[@class = 'smtListName'][contains(text(), 'user08 Eight')]");
pour html:<div class="smtListItem smtMessageItem"> <!-- ngIf: message.SentItem --> <!-- ngIf: !message.SentItem --><span class="smtListName ng-binding ng-scope" data-ng-if="!message.SentItem">user08 EIGHT</span><!-- end ngIf: !message.SentItem -->
xpath
j'ai fourni répond à vos critères de bien//span[@class = 'smtListName' and normalize-space(text()) = 'user08 EIGHT']