2017-02-14 206 views
1

我正在嘗試在yelp.com上查找元素。我嘗試過使用xPathClassNames,但似乎無法讓它檢索每個商家的星級評分。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 varRateRating = 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個小時。 –