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&nbsp;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.,