2017-09-16 2 views
0

J'essaie de prendre des notes sur des sites Web en utilisant webdriver. J'ai essayé jusqu'ici XPath, CSS, Classname mais, parfois il est localisé l'article, parfois non.Selenium WebDriver - Impossible de localiser l'exception d'un élément

Voici le code HTML que j'ai essayé de le prendre:

<td class="score" rowspan="6"><span class="p1_home">0</span> - <span class="p1_away">0</span></td>

Et ceci est mon code (que je l'ai essayé à ce jour):

firstHalf[i] = Driver.FindElement(By.XPath("//*[@id=\"parts\"]/tbody/tr[2]/td[2]")).Text; 

Autres versions:

firstHalf[i] = Driver.FindElement(By.CssSelector("#parts > tbody > tr:nth-child(2) > td.score")).Text; 
firstHalf[i] = Driver.FindElement(By.ClassName("score")).Text; 

Et aussi j'ai essayé les classes enfant (sous les classes de score), mais le résultat est le même, parfois peut être localisé l'élément, parfois il ne peut pas.

Une suggestion?

Mise à jour: Pour mon code, je mets quelques wait ou Thread.Sleep ne fonctionnera toujours pas.

for (int r = 0; r < 10; r++) 
       { 
        try 
        { 
         string d1 = Driver.FindElement(By.XPath("//span[@class='p1_home']")).Text; 
         string d2 = Driver.FindElement(By.XPath("//span[@class='p1_away']")).Text; 
         //firstHalf[i] = firstHalf[i].Replace(" ", ""); 
         firstHalf[i] = d1 + "-" + d2; 
         break; 
        } 
        catch (Exception e) 
        { 
         Thread.Sleep(300); 
         r -= 1; 
         eventCounter++; 
         if (eventCounter == 10) 
         { 
          errorMsg.sendErrMsg(e); 
          //errorMsg.stopProgram(); 
         } 
        } 
       } 
+0

Quel élément tu veux localiser – iamsankalp89

+0

@ iamsankalp89 Je veux trouver des cours de score' classe 'ou enfants et ceux-ci sont' 'p1_home' et p1_away' –

+0

// durée [@ class = 'p1_home'] et // span [@ class = 'p1_away'] – iamsankalp89

Répondre

0

D'accord, je trouve une solution avec un autre approche. Au lieu d'obtenir deux classes spécifiques, j'ai utilisé la classe parent score. En outre, j'ai supprimé le "pour la boucle" et "essayez" et "attraper" que j'utilise pour trouver l'objet encore et encore.

Pour ma boucle principale, j'ai ajouté "essayer" et "attraper". Quand j'ai eu l'exception, j'ai diminué le compteur de boucle, fermé la fenêtre et ouvert à nouveau. En outre, j'ai ajouté quelques Thread.Sleep afin de ne pas obtenir d'erreurs car Web-Driver agit si vite que cela provoque un problème.

Version mise à jour de mon code:

for (int i = 0;; i < stopLimit.Count; i++) 
{ 
    try 
    { 
      Thread.Sleep(500); 
      string score = Driver.FindElementByCssSelector("#parts > tbody > 
                tr:nth-child(2) > td.score").Text; 
      firstHalf[i] = score.Replace(" ", ""); 
    } 
    catch(Exception) 
    { 
      i--; 
      Thread.Sleep(1500); 
      Driver.SwitchTo().Window(Driver.WindowHandles.Last()); 
      Driver.Close(); 
      Driver.SwitchTo().Window(Driver.WindowHandles.First()); 
    } 
} 
1

Vous pouvez utiliser

//span[@class='p1_home'] 

//span[@class='p1_away'] 
+0

Je suis en train d'écrire maintenant, et je vais tester si le programme plante ou non –

+0

Ok essayer et laissez-moi savoir ce qui se passe – iamsankalp89

+0

Bon, je l'ai essayé. Sur la première course, cela a fonctionné parfaitement, mais sur la deuxième course, il s'est écrasé –

1

Pour localiser l'élément de classe particulière et attribut que vous pouvez utiliser sélecteur CSS. Par exemple:

Driver.FindElement(By.CssSelector(".score[rowspan='6']")).Text; 

Si vous rencontrez des problèmes pour localiser l'élément fiable, vous pouvez l'obtenir après certaines conditions sont remplies, comme suit:

WebDriverWait wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(30)); 
IWebElement element = wait.Until(ExpectedConditions.ElementIsVisible(By.CssSelector(".score[rowspan='6']"))); 
+0

Je suis en train de tester d'autres solution. Je vous ferai savoir si cela fonctionne ou pas plus tard –

+0

cette solution ne fonctionne pas du tout –

+0

Ajout d'une option alternative, pour résoudre les problèmes de temps de chargement possibles. – Eugene