2012-09-13 3 views
1
에게

시도를 사용하여 ID로 웹 페이지 요소를 찾을 수,는 왜이 셀레늄과 재생 셀레늄

static void Main(string[] args) 
     { 
      using (IWebDriver driver = new InternetExplorerDriver()) 
      { 

       driver.Navigate().GoToUrl("https://gmail.com"); 

       IWait<IWebDriver> wait = new WebDriverWait(driver, TimeSpan.FromSeconds(2.00)); 
       wait.Until(d => ExpectedConditions.ElementExists(By.Id("Email"))); 

       Console.WriteLine("Page loaded ..."); 

       IWebElement userNameElt = driver.FindElement(By.Id("Email")); 

       while (!userNameElt.Displayed) 
       { 
        Console.WriteLine("Page not finished loading yet ..."); 
        Thread.Sleep(3000); 
       } 


       userNameElt.SendKeys("[email protected]"); 
       userNameElt.Submit(); 

       IWebElement passwordElt = driver.FindElement(By.Id("Passwd")); 
       userNameElt.SendKeys("password"); 
       userNameElt.Submit(); 

       IWebElement submitBtnElt = driver.FindElement(By.Id("signIn")); 
       submitBtnElt.Click(); 
      } 
     } 

하지만 요소를

Started InternetExplorerDriver server (64-bit) 
2.25.3.0 
Listening on port 1423 
Page loaded ... 

Unhandled Exception: OpenQA.Selenium.NoSuchElementException: Unable to find element with id == Email 

어떤 생각을 찾을 수 없습니다 불평 아주 간단한 예제를 만들어 ?

+0

다른 요소는 어떻게됩니까? 이메일 대신 Passwd를 기다려보십시오. – opewix

+0

다른 드라이버는 어떻습니까? IE와 관련이 있는지 확인하십시오. – Arran

+0

user firefoxdrive, 사용자 이름을 채울 수 있지만 암호를 채우려고 할 때 "페이지가 변경 될 수 있습니다"예외가 발생합니다. – jojo

답변

1

몇 가지 예를 통해 읽는 것이 좋습니다.

먼저 네트워크에 따라 대기 시간 초과가 너무 짧을 수 있습니다. 2 초 정도면 충분하지 않을 수 있습니다. 최대 10 개까지 튀어서 더 안정적인지 확인하십시오.

두 번째로 대기 시간에서 람다 -fu를 삭제하십시오. 그것은 잘못된, 그리고 당신이 필요로하는 모든 또한, 수동 동안 (! userNameElt.Displayed) 루프가 이해가되지 않습니다 명심 간단한

wait.Until(ExpectedConditions.ElementExists(By.Id("Email"))); 

입니다. 위의 요소를 이미 기다렸으므로이 루프가 재생되지 않아야합니다.

마지막으로 SendKeys()를 사용한 후에 Submit()를 요소에 추가 할 필요가 없습니다.

다음은 리팩토링 된 코드 블록이며 안정적이며 트릭입니다.

using (IWebDriver driver = new InternetExplorerDriver()) 
{ 
    driver.Navigate().GoToUrl("https://gmail.com"); 

    IWait<IWebDriver> wait = new WebDriverWait(driver, TimeSpan.FromSeconds(2.00)); 
    wait.Until(ExpectedConditions.ElementExists(By.Id("Email"))); 

    driver.FindElement(By.Id("Email")).SendKeys("mysample.com"); 

    wait.Until(ExpectedConditions.ElementExists(By.Id("Passwd"))); 
    driver.FindElement(By.Id("Passwd")).SendKeys("password"); 

    driver.FindElement(By.Id("signIn")).Click(); 
}