[JAVA #11] [Web Automation #11] Controlling STEEMIT web pages with Selenium #9 Scroll [KR]

redsjavahouse1591357_1280.jpg
image source: pixabay


selenium에는 스크롤을 직접적으로 제어하는 메서드가 존재하지 않는다.
대신 JavascriptExecutor 인터페이스로 제어 가능한데 이 아이는 selenium에서 구현하기 어려운 부분을 자바스크립트코드로 제어하는 아주 막강한 아이다.
javascript로 구현할 수 있는 모든 기능을 제어할 수 있을 것으로 보인다.
오늘은 그 중 페이지 스크롤 제어법을 몇가지 알아본다. javascript를 잘 알면 더 쉽게 사용할 것 같다.(자바스크립트 다시 시작해야 하나?)

JavascriptExecutor는 WebDriver의 구현 클래스인 RemoteWebDriver 클래스가 구현을 마무리한 것으로 driver 변수를 캐스팅해서 인스턴스 생성할 수 있고, executeScript()메서드로 제어 가능하다. 인자는 두가지이고 첫 인자에는 javascript코드를 String으로 입력할 수 있고, 두번째 인자는 Object를 사용하되 가변인자이므로 넣지 않아도 무방하다. 👇

JavascriptExecutor je = (JavascriptExecutor) driver;
je.executeScript("window.scrollTo(0, 1000)");

아래와 같은 여러가지 방법으로 스크롤을 제어할 수 있다.

1. javascript의 window scrollTo, scrollBy로 제어

👇인자는 x좌표, y좌표로 입력가능하므로 가로/세로 스크롤을 제어할 수 있다.

je.executeScript("window.scrollTo(0, 1000)");

👇변수를 사용하여 조금 변형시키면 아래와 같다. (javascript로 스크롤 영역의 높이를 불러와서 y좌표에 입력한다. 즉 맨하단으로 스크롤이다.)

je.executeScript("window.scrollTo(0, document.body.scrollHeight)");

👇 혹은 스크롤의 현재 위치의 y좌표값을 불러와 y인자에 그 위치를 기준으로 +-알파값을 입력하는것이다.

je.executeScript("window.scrollTo(0, window.scrollY + 700)");
2.특정 태그로 스크롤

👇 javascript로 직접 택그를 찾아 scrollIntoView() 메서드로 태그의 위치로 스크롤할 수 있다.

je.executeScript("document.getElementById('content').scrollIntoView(true)");

👇 혹은 selenium으로 태그를 찾은 후 executeScript의 두번째 인자에 태그를 넣어 사용할 수도 있다.

WebElement ele = driver.findElements(By.id("posts_list")).get(0);
je.executeScript("arguments[0].scrollIntoView()",ele );
3. 키보드의 키로 제어

👇 키보드의 home/end 키 혹은 방향키로 제어가 가능하다. sendkeys()메서드로 키보드 키 호출이 가능하고, 태그는 html 태그를 설정하면 된다.

WebElement html = driver.findElement(By.tagName("html"));
html.sendKeys(Keys.HOME);
html.sendKeys(Keys.PAGE_DOWN);

위 코드를 모두 적용해 보았는데 정상적으로 동작한다. 개인적으로 2번이 가장 사용하기 좋을 것 같다.

package com.steem.webatuo;

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.Wait;
import org.openqa.selenium.support.ui.WebDriverWait;

import io.github.bonigarcia.wdm.WebDriverManager;

public class Steemit {
    
    public static void main(String[] args) throws InterruptedException {
        WebDriverManager.chromedriver().setup();
        WebDriver driver = new ChromeDriver();
        driver.get("https://steemit.com");
        
        Wait<WebDriver> wait = new WebDriverWait(driver, 10);

        Thread.sleep(2000);
        JavascriptExecutor je = (JavascriptExecutor) driver;
        je.executeScript("window.scrollTo(0, document.body.scrollHeight)");
        
        Thread.sleep(2000);
        je.executeScript("window.scrollTo(0, window.scrollY + 700)");
        
        Thread.sleep(2000);
        je.executeScript("document.getElementById('content').scrollIntoView(true)");
        
        Thread.sleep(2000);
        je.executeScript("window.scrollBy(0, document.body.scrollHeight)");
        
        Thread.sleep(2000);
        WebElement html = driver.findElement(By.tagName("html"));
        html.sendKeys(Keys.HOME);

        Thread.sleep(2000);
        html.sendKeys(Keys.PAGE_DOWN);
        
        Thread.sleep(2000);
        WebElement ele = driver.findElements(By.id("posts_list")).get(0);
        je.executeScript("arguments[0].scrollIntoView()",ele );
        driver.quit();
    }

}

.
.
.
.
[Cookie 😅]
Seleniun java lib version: 3.141.59
java version: 13.0.1

Sort:  

来的真快,还给这么多,萍萍真好😍😁

Posted using Partiko Android

守著你 好辛苦啊😭怕你被別人搶走了😂

Posted using Partiko Android

我贴迟了三分钟哈? 哈哈哈😁

Coin Marketplace

STEEM 0.17
TRX 0.15
JST 0.028
BTC 60111.17
ETH 2322.86
USDT 1.00
SBD 2.53