0

我正在寻找以下元素:

<input id="login_input" value="" class="input_long " type="text" name="login" tabindex="1">

此元素在初始页面完全加载后由 javascript 加载。现在这是我获取此元素的代码:

IWebDriver _drv = new ChromeDriver();
_drv.Navigate().GoToUrl("http://mysite.com");
System.Threading.Thread.Sleep(2000);
do
{
    try
    {
        _drv.FindElement(By.Id("login_input")).SendKeys("555567756756");
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
    }
} while (true);

它给我的错误是说A first chance exception of type 'OpenQA.Selenium.NoSuchElementException' occurred in WebDriver.dll,当这个元素在网站上清晰可见时。

我可以做些什么来获得这个元素?

更新:稍微更改了我的代码:

IWebDriver _drv = new ChromeDriver();
_drv.Url = "http://mysite.com";
//_drv.Navigate().GoToUrl("http://mysite.com");
do
{
    try
    {
        WaitUntilPresent(By.Id("login_input")).SendKeys("555567756756");
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
    }
} while (true);

IWebElement WaitUntilPresent(By element)
{
    return new WebDriverWait(_drv, TimeSpan.FromSeconds(10)).Until(ExpectedConditions.ElementExists(element));
}

以上给了我超时异常,这是因为_drv.PageSource页面上的javascript加载元素后没有更新。

4

1 回答 1

1

尝试使用显式等待。-
http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp#explicit-waits

您会收到该错误,因为FindElement()如果它不存在,则会出现错误。你说它在那里,但是这段代码可能在它可见之前就已经执行了。

你的代码看起来像

IWebDriver _drv = new ChromeDriver();
_drv.Get("http://mysite.com"); // don't use Navigate().GotoUrl().
// Don't use waits.. WebDriver has what's called "implicit waits" which prevent you from having to use Sleep().  That is why you don't see `selenium.waitForPageToLoad()` anymore.
WebElement field = waitUntilPresent(_drv.FindElement(By.Id("login_input")));
field.SendKeys("555567756756");


...
WebElement waitUntilPresent(WebElement element) {
    return new WebDriverWait(_drv, 10)) // might have to do some casting here
    .until(ExpectedConditions.PresenceOfElementLocated(element));
}
于 2013-05-08T15:11:10.120 回答