3

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

当页面加载了一些 javascript 来设置文本框的值。

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

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

我试过使用:

driver.FindElement(By.Id("txtBoxId") 获取元素,这也不会获取值。

我也试过 ChromeWebElement cwe = new ChromeWebElement(driver, "txtBoxId"); (抱怨过时的数据)。

有什么想法吗?

约翰

4

3 回答 3

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

于 2011-05-03T20:26:20.633 回答
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;
  }

或类似的规定

于 2010-09-23T21:47:51.200 回答
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++ 中使用类似的东西?

于 2010-10-15T10:35:53.687 回答