2017-05-28 190 views
2

我試圖獲得Amazon上任何產品的評分文本,但我無法編寫正確的代碼。我不明白我在這裏做錯了什麼。在這裏它甚至無法找到元素。 另外我不認爲xpath是錯誤的,因爲我檢查了Firepath。Java中的Selenium:無法定位亞馬遜上的元素

下面是代碼:

public static void main(String args[]) 
{ 
    System.setProperty("webdriver.gecko.driver", "D:\\Eclipse and workspace\\eclipse\\geckodriver.exe"); 
    WebDriver driver = new FirefoxDriver(); 

    driver.get("https://www.amazon.in/"); 

    WebElement elem = driver.findElement(By.id("twotabsearchtextbox")); 

    elem.sendKeys("Camera DSLR"); 

    driver.findElement(By.className("nav-input")).click(); 


    WebDriverWait wait = new WebDriverWait(driver,10); 
    wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(".//*[@id='result_0']/div/div/div/div[2]/div[3]/div[2]/div[1]/span/span/a/i[1]/span"))); 

    WebElement elem2 = driver.findElement(By.xpath(".//*[@id='result_0']/div/div/div/div[2]/div[3]/div[2]/div[1]/span/span/a/i[1]/span")); 
    elem2.getText(); 

} 

請幫助我。

+0

有2個元素,類名爲「nav-input」,一個按鈕和一個輸入文本。到哪個控制'driver.findElement(By.className(「nav-input」))。click();'這個工作嗎? –

+0

是的,只有最後一個沒有。最後一個是獲得產品的評級。 –

+0

它確實點擊並打開下一頁。 –

回答

3

你想要得到的span元素包含像"4.4 out of 5 stars"文本,但實際上你看到的只是與明星的圖標,所以它的使用visibilityOfElementLocated條件,因爲它是不可見的反正壞主意。

嘗試使用presenceOfElementLocated代替:

WebElement elem2 = wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//a[@class='a-popover-trigger a-declarative']//span[@class='a-icon-alt']"))); 
elem2.getAttribute("textContent"); 

注意,讓無形的跨度的文本內容,你應該使用getAttribute("textContent")代替getText()

+0

非常感謝。它有幫助。 :) –

0
  1. 使用動態的XPath,而不是絕對的XPath:

By.xpath("//*[contains(@class,'a-icon-star')]//*[contains(@class,'a-icon-alt')]")

而作爲rightly pointed out by @Andersson

  • 使用presenceOfElementLocated代替visibilityOfElementLocated作爲工具提示被設計爲不可見的。

  • 使用textContent屬性爲不可見元素,如工具提示而不是getText()