2014-04-15 91 views
2

使用硒我試圖打開一個瀏覽器,導航到谷歌和查找的文本搜索字段。硒 - C# - webdriver的 - 無法找到C#元素

我嘗試下面的

IWebDriver driver = new InternetExplorerDriver(@"C:\"); 

driver.Navigate().GoToUrl("www.google.com"); 

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(5)); 

IWebElement password = driver.FindElement(By.Id("gbqfq")); 

但出現以下錯誤 -

無法找到ID == gbqfq元素

+1

您使用的是哪個版本的Internet Explorer?有關Selenium Web Driver支持IE 11的已知問題。 –

+4

此外,我誠實的建議是使用**除Google **以外的任何其他網頁。不幸的是,大多數人選擇谷歌作爲他們的硒工作的「首要應用」,但它是迄今爲止,你會遇到的最複雜的網站之一(即標記是地獄,大大減少) - 你會遇到問題的工作與谷歌的網站,你不會與其他人。從一開始就省去麻煩! – Arran

+0

你可能已經檢查過了 - 但該ID不是動態生成的,對吧?如果是這樣,那麼ID將不會是一個可靠的方式來查找元素... – autoKarma

回答

0

您可以嘗試使用自旋等待

int timeout =0; 
while (driver.FindElements(By.id("gbqfq")).Count == 0 && timeout <500){ 
    Thread.sleep(1); 
    timeout++; 

} 
IWebElement password = driver.FindElement(By.Id("gbqfq")); 

這應該有助於確保日e元素實際上已經有時間出現了。

也注意到,在 「gbqfq」 ID是有點異味。我可能會嘗試一些比這個ID更有意義的匹配。

+2

這只是WebDriverWait的重新實現。 'Count'應該替換爲'Any'。 – Arran

2

這看起來像的this question的副本已經有了答案。

我可以告訴你我做了什麼,這似乎也爲我工作:

public static IWebElement WaitForElementToAppear(IWebDriver driver, int waitTime, By waitingElement) 
{ 
     IWebElement wait = new WebDriverWait(driver, TimeSpan.FromSeconds(waitTime)).Until(ExpectedConditions.ElementExists(waitingElement)); 
     return wait; 
} 

這應該等待的時間WAITTIME量,直到元素被發現或沒有。我遇到了很多動態頁面的問題,沒有加載我需要的元素,而WebDriver試圖更快地找到元素,而不是頁面加載它們,這是我的解決方案。希望能幫助到你!