1

尝试使用 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

任何想法?

4

1 回答 1

1

通过您的示例可以想到几件事。

首先,根据您的网络,Wait 的超时时间可能太短。两秒钟可能不够长。将其提高到十个,看看它是否更稳定。

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

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

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

最后,您不需要在使用 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();
} 
于 2012-09-14T14:07:00.497 回答