Оновлення веб-сторінки WebDriver під час очікування конкретних умов


154

Я шукаю більш елегантний спосіб оновити веб-сторінку під час тестів (я використовую Selenium2). Я просто надсилаю ключ F5, але мені цікаво, чи є у драйвера метод оновлення всієї веб-сторінки Ось мій код

    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();    

Можливо, є кращим рішенням для пошуку елемента на оновленій вручну сторінці

Відповіді:


294

На Java або JavaScript:

driver.navigate().refresh();

Це має оновити сторінку.


Радий! це допомогло тобі. Альтернативно, якщо ви використовуєте суто селен RC або WebDriverBackedSelenium, ви також можете використовувати: selenium.refresh ();
Manpreet Singh

47
Це не зовсім рівно, ніж натискання клавіші F5. driver.navigate().refresh()у своєму заголовку запиту зазначається "без кешу" і, як результат, безумовно перезавантажується весь вміст. Тоді як натискання клавіші F5 може призвести до запиту "If-Modified-Since", це може отримати відповідь "304 Not Modified". Ви повинні мати на увазі цю різницю, якщо ви робите тестові навантаження.
Всеволод Голованов

@Manpreet Дякую за рішення. Це варте оновлення.
RNS

75

В Python є спосіб зробити це: driver.refresh(). Це може бути не те саме в Java.

Ви також можете driver.get("http://foo.bar");, хоча я думаю, що метод оновлення повинен спрацювати чудово.


1
Якщо ви використовуєте, driver.get("http://foo.bar")ви можете просто скористатисяdriver.get(driver.current_url)
Метт М.


21

5 різних способів оновити веб-сторінку за допомогою Selenium Webdriver

Спеціального додаткового кодування немає. Я щойно використовував існуючі функції різними способами, щоб змусити її працювати. Ось вони :

  1. Використовуючи метод sendKeys.Keys

    driver.get("https://accounts.google.com/SignUp");
    driver.findElement(By.id("firstname-placeholder")).sendKeys(Keys.F5);
    
  2. Використовуючи метод navigate.refresh ()

    driver.get("https://accounts.google.com/SignUp");  
    driver.navigate().refresh();
    
  3. Використовуючи метод navigate.to ()

    driver.get("https://accounts.google.com/SignUp");  
    driver.navigate().to(driver.getCurrentUrl());
    
  4. Використовуючи метод get ()

    driver.get("https://accounts.google.com/SignUp");  
    driver.get(driver.getCurrentUrl());
    
  5. Використовуючи SendKeys () метод

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

16

Знайдено різні підходи до оновлення програми в селені: -

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)");

Для прямих кодів перейдіть за посиланням http://www.ufthelp.com/2014/11/Methods-Browser-Refresh-Selenium.html


1
Приємно! кілька способів зробити це. findElement (By.id ("Зв'яжіться з нами")) - це не гарний спосіб. Більш надійний завжди присутній елемент хороший, наприклад: '/ html / body'. Чи працює це для жорсткого оновлення? а що робити, якщо на сторінці є дані про публікацію, відомо, що в Firefox відображається діалогове вікно даних про публікацію.
mrtipale


5

Заміна для оновлення сторінки (F5)

driver.navigate().refresh();

(або)

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

4

Важливо відзначити, що дзвінок driver.navigate (). Refresh () іноді здається асинхронним, це означає, що він не чекає, коли оновлення закінчиться, він просто "запускає оновлення" і не блокує подальше виконання поки браузер перезавантажує сторінку.

Хоча це здається лише в меншій кількості випадків, ми подумали, що краще переконатися, що це працює на 100%, додавши вручну перевірити, чи дійсно сторінка почала перезавантажуватися.

Ось код, який я написав для цього в нашому об'єктному класі базової сторінки:

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();
}

Деякі примітки:

  • Оскільки ви перезавантажуєте сторінку, ви не можете просто перевірити існування заданого елемента, тому що елемент буде там, перш ніж розпочнеться перезавантаження і після того, як буде зроблено. Тому іноді ви можете справдитися, але сторінка ще не почала завантажуватися.
  • Коли сторінка перезавантажується, перевірка WebElement.isDisplayed () видасть StaleElementReferenceException. Решта - просто покрити всі основи
  • getName (): внутрішній метод, який отримує назву сторінки
  • getMaximumLoadTime (): внутрішній метод, який повертає, скільки довгих сторінок потрібно дозволити завантажувати за секунди
  • verify (): внутрішній метод гарантує, що сторінка фактично завантажена

Знову ж таки, у переважній більшості випадків цикл do / while працює одноразово, оскільки код за межами navigate (). Refresh () не виконується, поки браузер фактично не перезавантажив сторінку повністю, але ми спостерігали випадки, коли насправді потрібні секунди, щоб пройти цей цикл, оскільки навігація (). refresh () не блокується, поки браузер не завершить завантаження.


Відповідь з правдивою цінністю ... Дякую.
Огміос


2

Також є випадок, коли ви хочете оновити лише певні рамки на сторінці, а не повну сторінку.

Ви робите наступне:

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


1

Ще один спосіб оновити поточну сторінку за допомогою селену на Java.

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

Використовуючи це, оновіть поточну сторінку, наприклад натискання адресного рядка браузера та натискання клавіші Enter.


1

У R ви можете використовувати метод оновлення, але для початку ми переходимо до URL за допомогою методу навігації:

remDr$navigate("https://...")
remDr$refresh()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.