Selenium 2 WebDriver - Chrome - 从通过JavaScript设置的文本框中获取值

时间:2010-09-22 07:40:20

标签: c# selenium selenium-webdriver

我正在使用Selenium 2(来自Googlecode的最新版本),我让它启动Chrome并转到网址。

页面加载后,会执行一些javascript来设置文本框的值。

我告诉它通过id找到一个文本框,但它没有其中的值(如果我硬编码它找到的值)。

查看PageSource,例如Console.WriteLine(driver.PageSource);显示html,文本框为空。

我尝试过使用:

driver.FindElement(By.Id(“txtBoxId”)获取元素,但也没有获取值。

我还尝试过ChromeWebElement cwe = new ChromeWebElement(driver,“txtBoxId”); (抱怨Stale数据)。

有什么想法吗?

约翰

3 个答案:

答案 0 :(得分:4)

最后我找到了答案!这是适合我的代码

WebDriverWait wait = new WebDriverWait(_driver, new TimeSpan(0,0,60));
wait.Until(driver1 => _driver.FindElement(By.Id("ctl00_Content_txtAdminFind")));
Assert.AreEqual("Home - My Housing Account", _driver.Title);

这是我的来源! http://code.google.com/p/selenium/issues/detail?id=1142

答案 1 :(得分:2)

Selenium 2没有为DOM中的元素内置的等待函数。这与Selenium 1中的相同。

如果你必须等待某事,你可以将其作为

  public string TextInABox(By by)
  {
    string valueInBox = string.Empty;
    for (int second = 0;; second++) {
      if (second >= 60) Assert.Fail("timeout");
      try
      {
        valueInBox = driver.FindElement(by).value;
        if (string.IsNullOrEmpty(valueInBox) break;
      }
      catch (WebDriverException)
      {}
      Thread.Sleep(1000);
    }
    return valueInBox;
  }

或者那些行

答案 2 :(得分:1)

我通过ruby使用webdriver(黄瓜watir-webdriver,实际上),我倾向于这样做:

  def retry_loop(interval = 0.2, times_to_try = 4, &block)
    begin
      return yield
    rescue
      sleep(interval)
      if (times_to_try -= 1) > 0
        retry
      end
    end
    yield
  end

然后,每当我因javascript写入或其他内容而出现内容时,我只需将其包装在retry_loop中,如下所示:

    retry_loop do #account for that javascript might fill out values
      assert_contain text, element
    end

正如您所注意到的那样,如果它已经存在则没有性能损失。相反的情况(检查某些东西不存在)显然需要达到超时。 我喜欢在方法和测试代码中保存细节的方式。

也许你可以在C ++中使用类似的东西?