2017-01-06 137 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");