Мені подобається ваша ідея опитування HTML, поки вона не стабільна. Я можу додати це до власного рішення. Наступний підхід є в C # і вимагає jQuery.
Я розробник тестового проекту SuccessFactors (SaaS), де ми не маємо впливу на розробників або на характеристики DOM за веб-сторінкою. Продукт SaaS може потенційно змінювати свій базовий дизайн DOM 4 рази на рік, тому полювання постійно підтримується для надійних, ефективних способів тестування із селеном (включаючи НЕ тестування із селеном, де це можливо!)
Ось що я використовую для "сторінки готової". Зараз він працює у всіх моїх власних тестах. Цей же підхід працював і для великого внутрішнього веб-додатку Java пару років тому, і він був надійним протягом року, коли я покинув проект.
Driver
- це екземпляр WebDriver, який спілкується з браузером
DefaultPageLoadTimeout
- значення тайм-аута в кліщах (100ns на галочку)
public IWebDriver Driver { get; private set; }
// ...
const int GlobalPageLoadTimeOutSecs = 10;
static readonly TimeSpan DefaultPageLoadTimeout =
new TimeSpan((long) (10_000_000 * GlobalPageLoadTimeOutSecs));
Driver = new FirefoxDriver();
Далі зверніть увагу на порядок очікування у методі PageReady
(документ Selenium готовий, Ajax, анімації), що має сенс, якщо ви задумалися над цим:
- завантажте сторінку, що містить код
- використовувати код для завантаження даних звідкись через Ajax
- представити дані, можливо, з анімацією
Щось подібне до вашого методу порівняння DOM можна використати між 1 та 2, щоб додати ще один шар надійності.
public void PageReady()
{
DocumentReady();
AjaxReady();
AnimationsReady();
}
private void DocumentReady()
{
WaitForJavascript(script: "return document.readyState", result: "complete");
}
private void WaitForJavascript(string script, string result)
{
new WebDriverWait(Driver, DefaultPageLoadTimeout).Until(
d => ((IJavaScriptExecutor) d).ExecuteScript(script).Equals(result));
}
private void AjaxReady()
{
WaitForJavascript(script: "return jQuery.active.toString()", result: "0");
}
private void AnimationsReady()
{
WaitForJavascript(script: "return $(\"animated\").length.toString()", result: "0");
}