为什么不能使用Selenium通过id找到网页元素

时间:2012-09-13 03:00:30

标签: c# selenium-webdriver ui-automation

尝试使用Selenium,创建了一个非常简单的例子

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("my@sample.com");
                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

任何想法?

1 个答案:

答案 0 :(得分:1)

通过你的例子,我会想到几件事。

首先,根据您的网络,等待的超时可能太短。两秒钟可能不够长。撞到十点,看看它是否更稳定。

其次,从等待中丢弃lambda-fu。这是不正确的,你只需要一个简单的

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

另外,请记住,您的手册while(!userNameElt.Displayed)循环没有意义。你已经等了上面的那个元素,所以这个循环不应该发挥作用。

最后,在使用SendKeys()之后,您不需要提交()。

这是一个重构的代码块,它是稳定的并且可以解决问题。

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();
}