การรีเฟรชหน้าเว็บโดย 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-ตั้งแต่" ที่อาจได้รับการตอบสนอง "304 ไม่แก้ไข" คุณต้องคำนึงถึงความแตกต่างนั้นไว้ในใจหากคุณทำการทดสอบโหลด
Vsevolod Golovanov

@Manpreet ขอบคุณสำหรับการแก้ปัญหา มันคุ้มค่าที่จะ Upvote
RNS

75

ใน Python มีวิธีการดังนี้: driver.refresh()ในหลามมีวิธีการทำเช่นนี้:มันอาจจะไม่เหมือนกันใน Java

อีกวิธีหนึ่งคุณสามารถทำได้driver.get("http://foo.bar");แม้ว่าฉันคิดว่าวิธีการรีเฟรชน่าจะใช้ได้ดี


1
หากคุณกำลังใช้driver.get("http://foo.bar")เช่นกันอาจใช้เพียงdriver.get(driver.current_url)
Matt M.

54

ในหลาม

ใช้วิธีการในตัว

driver.refresh()

หรือกำลังเรียกใช้ JavaScript

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

เราจะรีเฟรชหน้ากิริยาได้อย่างไร
hamed baziyad

21

5 วิธีในการรีเฟรชเว็บเพจโดยใช้ Selenium Webdriver

ไม่มีการเข้ารหัสพิเศษเป็นพิเศษ ฉันเพิ่งใช้ฟังก์ชั่นที่มีอยู่ในรูปแบบต่างๆเพื่อให้มันทำงานได้ ที่นี่พวกเขาคือ:

  1. ใช้วิธีsendKeys.Keys

    driver.get("https://accounts.google.com/SignUp");
    driver.findElement(By.id("firstname-placeholder")).sendKeys(Keys.F5);
    
  2. ใช้วิธีนำทาง.refresh ()วิธีการ

    driver.get("https://accounts.google.com/SignUp");  
    driver.navigate().refresh();
    
  3. ใช้navigation.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

สิ่งสำคัญที่ควรทราบคือไดรเวอร์บางครั้งเรียกใช้ (). รีเฟรช () เรียกบางครั้งดูเหมือนจะไม่ตรงกันซึ่งหมายความว่ามันไม่รอให้การฟื้นฟูเสร็จ ขณะที่เบราว์เซอร์ทำการโหลดหน้าอีกครั้ง

แม้ว่าสิ่งนี้จะเกิดขึ้นในกรณีส่วนน้อยเท่านั้นเราคิดว่ามันจะดีกว่าเพื่อให้แน่ใจว่าใช้งานได้ 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 (): วิธีการภายในที่ส่งคืนระยะเวลาที่อนุญาตให้โหลดหน้าเว็บในไม่กี่วินาที
  • ตรวจสอบ (): วิธีการภายในทำให้แน่ใจว่าหน้าโหลดจริง

อีกครั้งในกรณีส่วนใหญ่ do / while loop ทำงานเพียงครั้งเดียวเพราะโค้ดที่อยู่เหนือการนำทาง (). รีเฟรช () ไม่ได้รับการดำเนินการจนกว่าเบราว์เซอร์จะโหลดหน้าเว็บอีกครั้งจริง ๆ แต่เราเห็นกรณีที่ ใช้เวลาไม่กี่วินาทีในการผ่านลูปนั้นเนื่องจากการนำทาง () การรีเฟรช () ไม่ได้ปิดกั้นจนกว่าเบราว์เซอร์จะโหลดเสร็จ


คำตอบด้วยมูลค่าที่แท้จริง ... ขอบคุณ
Ogmios


2

นอกจากนี้ยังมีกรณีเมื่อคุณต้องการรีเฟรช iframe เฉพาะบนหน้าเท่านั้นไม่ใช่เต็มหน้า

คุณทำดังนี้:

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()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.