如何在Java中使用Selenium WebDriver和/或Sikuli平滑滚动

2sbarzqh  于 2022-11-29  发布在  Java
关注(0)|答案(5)|浏览(204)

作为一个测试套件的一部分,我需要为一个Web应用程序测量FPS,以执行一个平滑的滚动网页。也就是说,当一个用户抓住滚动条,并用鼠标移动它一样平滑。
到目前为止,我已经尝试使用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(例如滚动时页面的平滑度)时是不合适的。

oo7oh9g9

oo7oh9g91#

解决方案比预期的要简单得多。我没有使用基于时间的循环条件,而是尝试了以下方法:

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

这很好用,有一个小的缺点,我不能指定滚动的长度(在时间上),只能指定要滚动的实际像素。

6kkfgxo0

6kkfgxo02#

两种方法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) {
    }
}
u5i3ibmn

u5i3ibmn3#

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)
u1ehiz5o

u1ehiz5o4#

这是一个使用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)
vs3odd8k

vs3odd8k5#

我的朋友。我知道这个问题很老了,但是我最近也需要答案。所以我把肩膀先生的答案修改了一下。希望它对别人有用:

JavascriptExecutor js = (JavascriptExecutor) driver;
    Long value1 = (long) 1;
    Long value2 = (long) 2;
    for (int i = Math.toIntExact(start);; 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;
    }

相关问题