Làm mới trang web bằng WebDriver khi chờ điều kiện cụ thể


154

Tôi đang tìm cách thanh lịch hơn để làm mới trang web trong các thử nghiệm (tôi sử dụng Selenium2). Tôi chỉ gửi khóa F5 nhưng tôi tự hỏi liệu trình điều khiển có phương pháp để làm mới toàn bộ trang web Đây là mã của tôi

    while(driver.findElements(By.xpath("//*[text() = 'READY']")).size() == 0 )
        driver.findElement(By.xpath("//body")).sendKeys(Keys.F5);
        //element appear after text READY is presented      
    driver.findElement(By.cssSelector("div.column a")).click();    

Có lẽ một số giải pháp tốt hơn để tìm phần tử trên trang được làm mới thủ công

Câu trả lời:


294

Trong Java hoặc JavaScript:

driver.navigate().refresh();

Điều này sẽ làm mới trang.


Vui vẻ! nó đã giúp bạn Ngoài ra, nếu bạn đang sử dụng hoàn toàn selenium RC hoặc WebDriverBackedSelenium, bạn cũng có thể sử dụng: selenium.refresh ();
Manpreet Singh

47
Nó không chính xác tương đương với nhấn F5 mặc dù. driver.navigate().refresh()trong tiêu đề yêu cầu của nó có nội dung "không có bộ đệm" và do đó, tải lại vô điều kiện tất cả nội dung. Trong khi nhấn F5 có thể dẫn đến yêu cầu "Nếu được sửa đổi từ khi", điều đó có thể nhận được phản hồi "304 Không được sửa đổi". Bạn phải ghi nhớ sự khác biệt đó, nếu bạn thực hiện kiểm tra tải.
Vsevolod Golovanov 16/2/13

@Manpreet Cảm ơn giải pháp. Nó xứng đáng với Upvote.
RNS

75

Trong Python có một phương thức để làm điều này : driver.refresh(). Nó có thể không giống nhau trong Java.

Ngoài ra, bạn có thể driver.get("http://foo.bar");, mặc dù tôi nghĩ rằng phương pháp làm mới chỉ hoạt động tốt.


1
Nếu bạn đang sử dụng driver.get("http://foo.bar")có thể chỉ cần sử dụngdriver.get(driver.current_url)
Matt M.

54

Trong trăn

Sử dụng phương thức tích hợp

driver.refresh()

hoặc, thực thi JavaScript

driver.execute_script("location.reload()")

Làm thế nào chúng ta có thể làm mới các trang phương thức?
ham baziyad

21

5 cách khác nhau để làm mới trang web bằng Selenium WebSearch

Không có mã hóa đặc biệt. Tôi vừa sử dụng các chức năng hiện có theo nhiều cách khác nhau để làm cho nó hoạt động. Họ đây rồi :

  1. Sử dụng phương thức sendKeys.Keys

    driver.get("https://accounts.google.com/SignUp");
    driver.findElement(By.id("firstname-placeholder")).sendKeys(Keys.F5);
    
  2. Sử dụng phương thức navigation.refresh ()

    driver.get("https://accounts.google.com/SignUp");  
    driver.navigate().refresh();
    
  3. Sử dụng phương thức navigation.to ()

    driver.get("https://accounts.google.com/SignUp");  
    driver.navigate().to(driver.getCurrentUrl());
    
  4. Sử dụng phương thức get ()

    driver.get("https://accounts.google.com/SignUp");  
    driver.get(driver.getCurrentUrl());
    
  5. Sử dụng phương thức sendKeys ()

    driver.get("https://accounts.google.com/SignUp"); 
    driver.findElement(By.id("firstname-placeholder")).sendKeys("\uE035");
    

16

Tìm thấy nhiều cách tiếp cận khác nhau để làm mới ứng dụng trong selenium: -

1.driver.navigate().refresh();
2.driver.get(driver.getCurrentUrl());
3.driver.navigate().to(driver.getCurrentUrl());
4.driver.findElement(By.id("Contact-us")).sendKeys(Keys.F5); 
5.driver.executeScript("history.go(0)");

Đối với mã trực tiếp, vui lòng tham khảo liên kết http://www.ufthelp.com/2014/11/Methods-Browser-Refresh-Selenium.html


1
Đẹp! nhiều cách để làm điều đó. findEuity (By.id ("Liên hệ với chúng tôi")) không phải là một cách hay. yếu tố đáng tin cậy hơn luôn luôn hiện diện là tốt, ví dụ: '/ html / body'. Điều này có làm việc cho làm mới cứng? và nếu trang có dữ liệu bài đăng, firefox được biết là hiển thị hộp thoại dữ liệu bài.
mrtipale

11

Đây là phiên bản C # hơi khác:

driver.Navigate().Refresh();

5

Thay thế cho Làm mới trang (F5)

driver.navigate().refresh();

(hoặc là)

Actions actions = new Actions(driver);
actions.keyDown(Keys.CONTROL).sendKeys(Keys.F5).perform();

4

Một điều quan trọng cần lưu ý là cuộc gọi driver.navigate (). Refresh () đôi khi dường như không đồng bộ, có nghĩa là nó không đợi quá trình làm mới kết thúc, nó chỉ "khởi động làm mới" và không chặn thực thi thêm trong khi trình duyệt đang tải lại trang.

Mặc dù điều này dường như chỉ xảy ra trong một số ít trường hợp, chúng tôi đã hiểu rằng tốt hơn là đảm bảo điều này hoạt động 100% bằng cách thêm kiểm tra thủ công xem trang có thực sự bắt đầu tải lại hay không.

Đây là mã tôi đã viết cho nó trong lớp đối tượng trang cơ sở của chúng tôi:

public void reload() {
    // remember reference to current html root element
    final WebElement htmlRoot = getDriver().findElement(By.tagName("html"));

    // the refresh seems to sometimes be asynchronous, so this sometimes just kicks off the refresh,
    // but doesn't actually wait for the fresh to finish
    getDriver().navigate().refresh();

    // verify page started reloading by checking that the html root is not present anymore
    final long startTime = System.currentTimeMillis();
    final long maxLoadTime = TimeUnit.SECONDS.toMillis(getMaximumLoadTime());
    boolean startedReloading = false;
    do {
        try {
            startedReloading = !htmlRoot.isDisplayed();
        } catch (ElementNotVisibleException | StaleElementReferenceException ex) {
            startedReloading = true;
        }
    } while (!startedReloading && (System.currentTimeMillis() - startTime < maxLoadTime));

    if (!startedReloading) {
        throw new IllegalStateException("Page " + getName() + " did not start reloading in " + maxLoadTime + "ms");
    }

    // verify page finished reloading
    verify();
}

Một số lưu ý:

  • Vì bạn đang tải lại trang, bạn không thể kiểm tra sự tồn tại của một yếu tố nhất định, bởi vì yếu tố đó sẽ ở đó trước khi tải lại bắt đầu và sau khi nó được thực hiện. Vì vậy, đôi khi bạn có thể trở thành sự thật, nhưng trang thậm chí chưa bắt đầu tải.
  • Khi trang tải lại, kiểm tra WebEuity.isDisplayed () sẽ đưa ra StaleEuityReferenceException. Phần còn lại chỉ là để trang trải tất cả các căn cứ
  • getName (): phương thức nội bộ lấy tên của trang
  • getMaximumLoadTime (): phương thức nội bộ trả về thời gian trang sẽ được phép tải trong vài giây
  • verify (): phương thức bên trong đảm bảo trang thực sự được tải

Một lần nữa, trong phần lớn các trường hợp, vòng lặp do / while chạy một lần duy nhất vì mã nằm ngoài điều hướng (). Refresh () không được thực thi cho đến khi trình duyệt thực sự tải lại trang hoàn toàn, nhưng chúng ta đã thấy các trường hợp trong đó thực sự phải mất vài giây để vượt qua vòng lặp đó vì điều hướng (). refresh () không chặn cho đến khi trình duyệt tải xong.


Câu trả lời với giá trị thực sự ... Cảm ơn.
Ogmios


2

Cũng có trường hợp khi bạn chỉ muốn làm mới iframe cụ thể trên trang chứ không phải toàn bộ trang.

Bạn làm như sau:

public void refreshIFrameByJavaScriptExecutor(String iFrameId){
        String script= "document.getElementById('" + iFrameId+ "').src = " + "document.getElementById('" + iFrameId+ "').src";
       ((IJavaScriptExecutor)WebDriver).ExecuteScript(script);
}


1

Một cách khác để làm mới trang hiện tại bằng cách sử dụng selen trong Java.

//first: get the current URL in a String variable
String currentURL = driver.getCurrentUrl(); 
//second: call the current URL
driver.get(currentURL); 

Sử dụng điều này sẽ làm mới trang hiện tại như nhấp vào thanh địa chỉ của trình duyệt và nhấn enter.


1

Trong R, bạn có thể sử dụng phương thức làm mới, nhưng để bắt đầu với chúng tôi điều hướng đến một url bằng phương pháp điều hướng:

remDr$navigate("https://...")
remDr$refresh()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.