2017-02-14 7 views
1

Я пытаюсь найти элемент на yelp.com. Я пробовал использовать xPath и ClassNames, но, похоже, не может получить его, чтобы получить рейтинг звезд для каждого бизнеса.Не удается получить Selenium, чтобы найти элемент

Вот рейтинг звезда 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> 

Вот мой код, чтобы получить рейтинг:

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

Я хотел бы, чтобы это вернуть 4.5, так что я могу сохранить что в другой файл , Я использую C# и Visual Studio.

+2

Что вы пытаетесь до сих пор? – Flott

+2

Добро пожаловать в SO. Отправьте свой код, как HTML-элемент, который вы хотите найти, так и код, который вы написали, чтобы найти элемент. Трудно получить какую-либо помощь, не помогая читателям вашего сообщения понять, насколько это возможно, вашей проблемой. – Christos

+0

Пока у меня это как код, чтобы попробовать найти его var starRating = driverGC.FindElement (By.LinkText ("title")); но я попытался использовать XPath, ClassName и ID, но я не могу найти ни одного из них, чтобы найти нужный элемент. Есть ли способ, которым я могу установить его для поиска элемента для определенной строки, чтобы я мог быть более конкретным? –

ответ

0

Если у вас есть только один результат, я думаю, вы можете это сделать. Или настроить его по мере необходимости, если вам нужно найти определенный рейтинг:

// 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()); 

В качестве альтернативы, если вы хотите перебрать все элементы:

// 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()); 
} 

Split(' ').First() должен вернуть первое слово, которое 4,5. Примечание: вам понадобится инструкция using System.Linq;, чтобы использовать First(), или если вы в конечном итоге используете ToList().

+0

Я добавил это, поскольку он казался лучшим, но теперь я получаю ошибку в преобразовании коллекции только для чтения в список. Какие-нибудь исправления? –

+0

К сожалению, это должно быть 'IList ' вместо 'List '. Я уточню свой ответ. Вы также можете использовать «Список starRatings = driver.GC.FindElements (By.ClassName (« I-stars »)). ToList();' также, но программирование на интерфейсах - это, как правило, лучшая идея. – mrfreester

+0

Я также добавил код, чтобы получить первое слово, которое должно быть «4.5» в вашем примере. Я не тестировал этот материал, поэтому дайте мне знать, если вы столкнетесь с другой ошибкой :) – mrfreester

0

Вы можете найти и фильтр бизнеса, как это (в 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

Вы знаете, как это сделать с C#? Я получаю как минимум 8 часов с этим, когда добавляю его. –