2017-02-14 1 views
1

J'essaie de trouver un élément sur yelp.com. J'ai essayé d'employer xPath et ClassNames mais ne peux pas sembler pouvoir l'obtenir pour récupérer les estimations d'étoile pour chaque entreprise.Impossible d'obtenir Selenium pour trouver l'élément

Voici le nombre d'étoiles HTML:

<div class="i-stars i-stars--regular-4-half rating-large" title="4.5 star rating"> 
    <img class="offscreen" height="303" src="https://s3-media1.fl.yelpcdn.com/assets/srv0/yelp_design_web/41341496d9db/assets/img/stars/stars.png" width="84" alt="4.5 star rating"> 
</div> 

Voici mon code pour récupérer la note:

var starRating = driverGC.FindElement(By.LinkText("title")); 
MessageBox.Show(starRating.Text); 

Je voudrais qu'il revienne le 4.5 donc je peux sauver que dans un autre fichier . J'utilise C# et Visual Studio.

+2

Qu'est-ce que vous avez essayé jusqu'à présent? – Flott

+2

Bienvenue sur SO. Veuillez poster votre code, à la fois l'élément HTML que vous voulez trouver et le code que vous avez écrit pour trouver l'élément. Il est assez difficile d'obtenir de l'aide, sans aider les lecteurs de votre message à comprendre autant que possible votre problème. – Christos

+0

Jusqu'à présent, j'ai ce code pour essayer de trouver var starRating = driverGC.FindElement (By.LinkText ("title")); mais j'ai essayé d'utiliser XPath, ClassName et ID, mais je n'arrive pas à en trouver pour trouver le bon élément. Y a-t-il un moyen de le configurer pour rechercher une chaîne dans l'élément afin de pouvoir être plus précis? –

Répondre

0

Si vous n'avez qu'un seul résultat, je pense que vous pouvez le faire. Ou personnaliser selon les besoins si vous avez besoin de trouver une notation spécifique:

// The rating element 
var starRating = driverGC.FindElement(By.ClassName("i-stars")); 
// The title attribute on the rating element is something like '4.5 star rating' 
// which I think is what you're trying to find. 
MessageBox.Show(starRating.GetAttribute("title").Split(' ').First()); 

Alternativement, si vous voulez faire une boucle à travers tous les éléments:

// The rating element 
IList<IWebElement> starRatings = driverGC.FindElements(By.ClassName("i-stars")); 
// The title attribute on the rating element is something like '4.5 star rating' 
// which I think is what you're trying to find. 
foreach (IWebElement elem in starRatings) 
{ 
    MessageBox.Show(elem.GetAttribute("title")Split(' ').First()); 
} 

Le Split(' ').First() doit retourner le premier mot, qui est 4.5. Note: vous aurez besoin d'une instruction using System.Linq; pour utiliser First(), ou si vous utilisez ToList().

+0

J'ai ajouté cela comme si cela semblait être le meilleur, mais maintenant je reçois une erreur sur la conversion de la collection en lecture seule à une liste. Des correctifs? –

+0

Oups, cela devrait être 'IList ' au lieu de 'Liste '. Je vais mettre à jour ma réponse. Vous pouvez également faire 'List starRatings = driver.GC.FindElements (By.ClassName (" I-stars ")). ToList();' aussi, mais la programmation par rapport aux interfaces est généralement une meilleure idée. – mrfreester

+0

J'ai aussi ajouté du code pour obtenir le premier mot, qui devrait être '4.5' dans votre exemple. Je n'ai pas testé ce genre de choses alors laissez-moi savoir si vous rencontrez une autre erreur :) – mrfreester

0

Vous pouvez trouver et les entreprises de filtrage comme celui-ci (en Java):

List<WebElement> starRatings = driver.findElements(By.xpath("//div[contains(@title, 'star rating')]")); 
List<WebElement> businesses = driver.findElements(By.xpath("//div[contains(@title, 'star rating')]/preceding::a[1]/span")); 
for(int i = 0; i < starRatings.size(); i++) 
{ 
     String rating = starRatings.get(i).getAttribute("title"); 
     rating = rating.split(" ")[0]; 
     DecimalFormat df = new DecimalFormat("#.#"); 
     Double d = Double.valueOf(rating); 
     rating = df.format(d); 
     d = Double.valueOf(rating); 
     if(d <= 3) 
     { 
      String Businessname = businesses.get(i).getText(); 
      //Write variable Businessname & rating into file 
     } 
} 
+0

Savez-vous comment le faire avec C#? J'obtiens au moins 8 heures avec ceci quand je l'ajoute. –