簡體   English   中英

如何使用 Selenium WebDriver 和/或 Java 中的 Sikuli 平滑滾動

[英]How to scroll smoothly with Selenium WebDriver and/or Sikuli in Java

作為測量 web 應用程序 FPS 的測試套件的一部分,我需要執行 web 頁面的平滑滾動。 也就是說,與用戶抓住滾動條並用鼠標移動它時的平滑度相同。

到目前為止,我已經嘗試通過使用 sikuli 模擬按鍵,即多次按下向上/向下箭頭鍵來滾動整個頁面。 我也嘗試過使用 Javascript 方法:

public void scrollSmooth(int durationOfScroll){
    long timeWhenStarting = System.currentTimeMillis() / 1000L;
while (System.currentTimeMillis() / 1000L - timeWhenStarting < durationOfScroll) {
    ((JavascriptExecutor) driver).executeScript("window.scrollBy(0,10)", "");
    }
}

這兩種方法都無法實現它們的目的,因為它們都會生成逐步滾動,當我同時想測量 FPS(例如滾動時頁面的平滑度)時,這不適合。

該解決方案比預期的簡單得多。 我沒有在循環中使用基於時間的條件,而是嘗試了以下操作:

public void scrollSmooth(){
    for(int i=0;i<6000;i++) {
        ((JavascriptExecutor) driver).executeScript("window.scrollBy(0,1)", "");
    }
}

這很好,但缺點是我無法指定滾動的長度(時間),只能指定實際要滾動的像素。

html = driver.find_element(By.XPATH,'//body')
total_scroled = 0
page_height = driver.execute_script("return document.body.scrollHeight")
while total_scroled < page_height:
    html.send_keys(Keys.PAGE_DOWN)
    total_scroled += 400
    time.sleep(.5)

有兩種方法:scrollDown和scrollUp,希望有幫助。 :)

 /**
 * scrollDown() method scrolls down the page.
 *
 * @return void
 */
public void scrollDown(WebDriver driver) {
    try {
        int i=0;
        for(;i<=30;i++) {
            ((JavascriptExecutor) driver).executeScript(("window.scrollBy(0,"+i+")"), "");
        }
        for(;i>0;i--) {
            ((JavascriptExecutor) driver).executeScript(("window.scrollBy(0,"+i+")"), "");
        }
    } catch (WebDriverException wde) {
    } catch (Exception e) {
    }
}

/**
 * scrollUp() method scrolls up the page.
 *
 * @return void
 */
public void scrollUp(WebDriver driver) {
    try {
        int i=0;
        for(;i>-30;i--) {
            ((JavascriptExecutor) driver).executeScript(("window.scrollBy(0,"+i+")"), "");
        }
        for(;i<0;i++) {
            ((JavascriptExecutor) driver).executeScript(("window.scrollBy(0,"+i+")"), "");
        }
    } catch (WebDriverException wde) {
    } catch (Exception e) {
    }
}

這是帶有 Python 的 Selenium 版本 -

from selenium import webdriver
import chromedriver_autoinstaller
from time import sleep

chromedriver_autoinstaller.install()
driver = webdriver.Chrome()

def scroll_down(driver):
    page_height = driver.execute_script("return document.body.scrollHeight")
    total_scrolled = 0
    for i in range(page_height):
        driver.execute_script(f'window.scrollBy(0,{i});')
        total_scrolled += i
        if total_scrolled >= page_height/2:
            last_no = i
            break
            
    for i in range(last_no, 0, -1):
        driver.execute_script(f'window.scrollBy(0,{i});')


def scroll_up(driver):
    page_height = driver.execute_script("return document.body.scrollHeight")
    total_scrolled = 0
    for i in range(0, -page_height, -1):
        driver.execute_script(f'window.scrollBy(0,{i});')
        total_scrolled += i
        if total_scrolled <= -page_height/2:
            last_no = i
            break
    for i in range(last_no, 0):
        driver.execute_script(f'window.scrollBy(0,{i});')

scroll_down(driver)
sleep(2)
scroll_up(driver)

我朋友。 我知道這個問題很老了,但我最近也需要回答。 所以我接受了Mr.Shoulder的回答並修改了它。 希望它對某人有用:

    JavascriptExecutor js = (JavascriptExecutor) driver;
    Long value1 = (long) 1;
    Long value2 = (long) 2;
    for (int i = 0;; i++) {
        if (i % 2 == 0)
            value1 = (Long) js.executeScript("return window.pageYOffset;");
        else
            value2 = (Long) js.executeScript("return window.pageYOffset;");
        js.executeScript("window.scrollBy(0,4)", "");
        if (value1.equals(value2))
            break;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM