Kararlı hale gelene kadar HTML sorgulama fikrinizi beğendim. Bunu kendi çözümüme ekleyebilirim. Aşağıdaki yaklaşım C # içindedir ve jQuery gerektirir.
Web sayfasının arkasındaki DOM'un özellikleri veya geliştiriciler üzerinde hiçbir etkimizin olmadığı bir SuccessFactors (SaaS) test projesinin geliştiricisiyim. SaaS ürünü, temeldeki DOM tasarımını yılda 4 kez potansiyel olarak değiştirebilir, bu nedenle Selenium ile test etmek için sağlam, performanslı yollar arayışı kalıcı olarak devam eder (mümkünse Selenium ile test ETMEMEK dahil!)
İşte "sayfaya hazır" için kullandığım şey. Şu anda tüm kendi testlerimde çalışıyor. Aynı yaklaşım, birkaç yıl önce büyük bir şirket içi Java web uygulaması için de işe yaradı ve projeden ayrıldığımda bir yıldan fazla bir süredir sağlamdı.
Driver tarayıcıyla iletişim kuran WebDriver örneğidir
DefaultPageLoadTimeout tik cinsinden bir zaman aşımı değeridir (onay başına 100 ns)
public IWebDriver Driver { get; private set; }
// ...
const int GlobalPageLoadTimeOutSecs = 10;
static readonly TimeSpan DefaultPageLoadTimeout =
new TimeSpan((long) (10_000_000 * GlobalPageLoadTimeOutSecs));
Driver = new FirefoxDriver();
Aşağıda, PageReadydüşünürseniz mantıklı olan yöntemdeki bekleme sırasına (Selenium belgesi hazır, Ajax, animasyonlar) dikkat edin:
- kodu içeren sayfayı yükle
- Ajax aracılığıyla bir yerden veri yüklemek için kodu kullanın
- verileri muhtemelen animasyonlarla sunun
DOM karşılaştırma yaklaşımınız gibi bir şey, başka bir sağlamlık katmanı eklemek için 1 ile 2 arasında kullanılabilir.
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");
}