Selenium 2 WebDriver -Chrome- JavaScriptを介して設定されたテキストボックスから値を取得する
-
04-10-2019 - |
質問
Selenium 2(GoogleCodeの最新リリース)を使用していますが、Chromeを発射してURLに行っています。
ページがロードされたとき、いくつかのJavaScriptはテキストボックスの値を設定するために実行されます。
私はそれが行うIDによるテキストボックスを見つけるように言いますが、それはその中に値がありません(それが見つけた値をハードコードすると)。
Pagesource EG Console.WriteLine(driver.Pagesource)を見る; HTMLを表示し、テキストボックスが空です。
私は使用しようとしました:
driver.findelement(by.id( "txtboxid")要素を取得すると、それも値を取得しません。
また、ChromeWebelement CWE = new ChromeWebelement(ドライバー、 "Txtboxid")を試しました。 (これは古いデータについて不平を言っています)。
何かご意見は?
ジョン
解決
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;
}
またはそれらの線に沿って何か
他のヒント
最後に答えを見つけました!これは私に役立つコードです
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
Ruby(実際にはキュウリWatir-Webdriver)を介して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 ++で同様のものを使用できますか?