2011-06-23 23 views
5

Göreceli olarak basit bir görev gerçekleştirmeye çalışıyorum: bir sayfa yönlendirmesi tamamlanana kadar beklemek. Sadece another ile ilgili soruya cevap verildi, bu konuyla ilgili bir sayfanın görünmesi için bir tavsiyenin beklenmesi gereken bir soru (Eğer doğru anladım). Eğer öyleyse, window.location kadar beklemek ne hakkında olacak? Daha iyi mi? Daha da kötüsü? Daha az uygulanabilir mi? Başka bir fikrin var mı? sadece meraklısı, gerekirse, bu soru bir topluluk wiki olarak işaretleyebilirsiniz.Selenium'da bir sayfa yönlendirmesi nasıl beklenir?

Teşekkürler!

cevap

1

Değerin izlenmesi, driver.get_location numaralı iadenin bana mükemmel bir iş yaptı. Görünüşe göre, 5 dakikamda anladığım kadarıyla kodun içine gözetleme, kaputun altında window.location.href değerinin izlenmesiydi.

+4

Değeri nasıl izlediğiniz hakkında biraz daha ayrıntılı bilgi verebilir misiniz? – emery

+0

Lütfen detaylandırır mısınız? –

1

Evet Selenium'u kullanırken bu sorunla birçok kez karşılaştım. Bu problemin etrafında çalıştığım 2 yol var. Öncelikle kapalı bekleme süresini değiştirebilirsiniz. denir noktada "lala" sınıfıyla eşleştirmek için bulunamadı hiçbir öğe yoksa, bu kod bir istisna durumu

Actions builder = new Actions(driver); 
builder.click(driver.findElement(By.className("lala"))).perform(); 

: Örneğin bu kod parçası verilir. Sen bu örtük bekleme süresini değiştirebilirsiniz:

driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); 

Bu 5 saniye yerine hemen başarısız olduğu için sürücü anket yapar. Eğer eleman 5 saniye sonra hala yerleştirilemiyorsa, eylem başarısız olur. Tabii ki bu ayarı değiştirebilirsiniz. Bu yöntemin çoğu zaman iyi çalıştığını gördüm. Çoğu zaman tüm sayfa yüklemesini önemsemiyorsunuz, sadece belirli bir bölüm.

public static void waitAndClick(WebDriver driver, By by, String text) { 
    WebDriverWait wait = new WebDriverWait(driver, 10000); 
    Function<WebDriver, Boolean> waitForElement = new waitForElement(by); 
    wait.until(waitForElement); 

    for(WebElement e : driver.findElements(by)) { 
     if(e.getText().equals(text)) { 
      Actions builder = new Actions(driver); 
      builder.click(e).perform(); 
      return; 
     } 
    } 
} 

Ve: o da ince istediğini detaylandırılması izin de içeren metni denetler hariç

Ben de bir eleman üzerinde örtülü bekleme ile aynı yapacak GetElementByClassAndText olan başka bir fonksiyon yazdım kullandığı İşlevini tekabül:

public class waitForElement implements Function<WebDriver, Boolean> { 
    private final By by; 
    private String text = null; 

    public waitForElement(By by) { 
     this.by = by; 
    } 

    public waitForElement(By by, String text) { 
     this.by = by; 
     this.text = text; 
    } 

    @Override 
    public Boolean apply(WebDriver from) { 
     if(this.text != null) { 
      for(WebElement e : from.findElements(this.by)) { 
       if(e.getText().equals(this.text)) { 
        return Boolean.TRUE; 
       } 
      } 

      return Boolean.FALSE; 
     } else { 
      try { 
       from.findElement(this.by); 
      } catch(Exception e) { 
       return Boolean.FALSE; 
      } 

      return Boolean.TRUE; 
     } 
    } 
} 

sana Ruby selenyum kullanarak ama umarım kodumu bazıları (en azından kavramsal olarak) yediğinin farkına transfer ve size yardımcı olur.

+0

Bunun gerçekten şu soruya cevap verdiğinden emin değilim: sadece kodunuzun uyguladığı strateji türünü kullanmak yerine window.location'daki bir değişikliği kontrol etmek mümkün mü? – emery

-3

Bu işlevi kullanabilirsiniz, geçerli sayfayı yeniden yükler (yeniden yönlendirildikten sonra): driver.getCurrentUrl();

İlgili konular