2017-01-06 168 views
0

起初,我在Selenium IDE firefox addon中創建了一個代碼,它從網站上抓取數據。當然,它在IDE中正常工作。Selenium C# - 無法找到元素

我想從這個刮網址:

<div class="gs-per-result-labels" url="http://example.com/foo/bar"></div> 

爲HTML顯示如:

<tr> 
    <td>open</td> 
    <td>http://example.com</td> 
    <td></td> 
</tr> 

<tr> 
    <td>storeAttribute</td> 
    <td>//div[@class='gs-per-result-labels']@url</td> 
    <td>myValue</td> 
</tr> 

<tr> 
    <td>echo</td> 
    <td>${myValue}</td> 
    <td></td> 
</tr> 

兩個命令是否正確執行和echo是給權值。接下來,我將格式更改爲C#/NUnit/WebDriver,並將代碼複製到Visual Studio 2015.我添加了FirefoxDriverIWebDriver引用。這是代碼:

private static IWebDriver driver; 
static void Main(string[] args) 
{ 
    driver = new FirefoxDriver(); 

    driver.Navigate().GoToUrl("http://example.com"); 
    Thread.Sleep(10000); 
    string myValue = driver.FindElement(By.XPath("//div[@class='gs-per-result-labels']")).GetAttribute("url"); 
} 

我還添加了Sleep,以確保當談到刮值的頁面完全加載。問題是我在FindElement函數上出錯,因爲driver找不到元素。我想知道爲什麼會發生這種情況。一切似乎都是一樣的。你有什麼建議嗎?

我認爲這是值得說:我要湊是由PHP或JavaScript生成的內容(那是「榜樣」頁面未被谷歌在谷歌搜索結果)

+0

你的HTML樣本不含有任何'div'秒。那是故意的嗎? – Stuart

+0

有'/ div [@ class ='gs-per-result-labels']' –

+0

因此XPath查詢XML,查詢'// div [@ class ='gs-per-result-labels']'會使用''gs-per-result-labels''來查找具有'class'屬性的'div'元素。它不會對HTML主體進行純文本搜索。 – Stuart

回答

0

最佳方法是檢查Xpath是否絕對正確。您可以隨時使用Firebug,或者如果你想這樣做編程,以下行應該幫助

List<WebElement> existList=driver.FindElement(By.XPath("//div[@class='gs-per-result-labels']")); 
if(existList.size()>0){ 
    //SOPL("element present"); 
} 

我會建議你使用顯式的等待

WebDriverWait wait=new WebDriverWait (driver,60); 
wait.until(ExpectedConditions.visibilityOfElementLocated(By.XPath("//div[@class='gs-per-result-labels']"))); 
    string myValue = driver.FindElement(By.XPath("//div[@class='gs-per-result-labels']")).GetAttribute("url");