IT이야기

Selenium WebDriver를 사용하여 JavaScript 변수 읽기

cyworld 2021. 9. 26. 11:31
반응형

Selenium WebDriver를 사용하여 JavaScript 변수 읽기


Selenium WebDriver(Java) 및 TestNG를 사용하여 내가 만든 웹사이트에서 몇 가지 테스트를 수행하고 있습니다. 이 웹 사이트에는 JavaScript도 있고 일부 기능에서는 값을 반환하고 console.log().

Selenium WebDriver가 이 JavaScript 정보에 액세스하여 TestNG를 사용하여 어설션을 수행할 수 있는 쉬운 방법이 있는지 궁금합니다.

저는 Selenium을 처음 접했지만 다음과 같이 할 수 있다는 것을 이해합니다.

WebDriver driver = new ChromeDriver();
driver.findElement(By.id("btn")).click();

WebDriver사이트에서 JavaScript를 읽는 데 사용할 수 있는 유사한 작업이 있습니까?


설명

사람들이 내가 Selenium을 통해 JavaScript 코드를 "실행"하려고 한다고 가정하는 것 같습니다.

그렇지 않습니다. 대신 Selenium을 사용하여 이미 정의된 JavaScript 변수를 저장하려고 합니다.

기본적으로 Selenium이 JavaScript 변수의 값을 가져와서 로컬에 저장한 다음 이에 대한 어설션 테스트를 수행할 수 있기를 바랍니다.


시도 1

내 웹 사이트에 다음과 같은 JS 코드가 있다고 가정해 보겠습니다.

$(document).ready(function() {
    var foo = $(#"input-field-val").val();

    function returnFoo() {
        return foo;
    }
});

내가 읽고 이해한 바에 따르면 별도의 Selenium 테스트 파일(Selenium.java)에서 다음과 같이 할 수 있어야 합니다.

public class Selenium {
    WebDriver driver = new FirefoxDriver();
    JavascriptExecutor js = (JavascriptExecutor) driver;

    @Test
    public void testSample() {
        driver.get("www.mywebsite.com");
        js.executeScript("alert(returnFoo());");
    }
}

위와 비슷한 작업을 수행하지만 경고 상자가 팝업되지 않습니다. 대신 오류 메시지가 나타납니다.

Exception in thread "main" org.openqa.selenium.WebDriverException: ReferenceError: returnFoo is not defined

JS 변수가

클로저 또는 지역 변수의 일부가 아니어야 합니다.

또한 위의 전역 변수를 정의하려고 시도 $(document).ready(function()...했으며 설정이 안에 function returnFoo()있지만 여전히 작동하지 않습니다.


시도 2

나는 둘 다 fooreturnFoo()밖을 옮겼다 $(document).ready(function().... 그것은 ReferenceError내가 위의 시도 1 에서 받고 있다는 메시지를 수정했습니다 .

foo내 JS 코드가 다음과 같이 보이도록 값 도 지정 했습니다.

var foo = "Selenium test run";

$(document).ready(function() {
...
});

function returnFoo() {
    return foo;
}

이제 returnFoo()Selenium 테스트 내에서 지역 변수에 의 반환을 할당하는 데 어려움을 겪고 있습니다. 내가 시도한 것은 다음과 같습니다.

public static void main(String[] args) {
        WebDriver driver = new FirefoxDriver();
        JavascriptExecutor js = (JavascriptExecutor) driver;

        driver.get("http://localhost:8080/HTML5TestApp/prod.html");
        Object val = js.executeScript("window.returnFoo();");
        System.out.println(val);
    } 

그러나 "Selenium test run"null 의 실제 값 대신 콘솔이 표시 됩니다 .

시도 2 - 솔루션

Object val = js.executeScript("alert(returnFoo());");내가 하면 의 값을 얻는 것처럼 보입니다 foo.


해결책

그래서 여기 Martin Foot의 솔루션 덕분에 내 문제에 대해 생각해낸 솔루션이 있습니다.

내 JavaScript 파일에서 다음 var과 같이 setter/getter 함수를 만들었습니다 .

index.js

var seleniumGlobal;

$(document).ready(function() {
...
)};

function setSG(toSet) {
    seleniumGlobal = toSet;
}

function getSG() {
    return seleniumGlobal;
}

샘플 테스트.자바

// Do all the necessary imports

public class SampleTest {
    WebDriver driver = new FirefoxDriver();
    JavascriptExecutor js = (JavascriptExecutor) driver;

    @Test
    public void testPrintVal() {
        String sgVal = (String) js.executeScript("alert(getSG());");
        Assert.assertEquals("new value for seleniumGlobal", sgVal);
    }
}

따라서 JavaScript의 일부 코드가 seleniumGlobalsetter 메서드를 통해 변수를 설정할 때마다 Selenium 테스트를 통해 해당 변수를 호출하고 이에 대한 어설션을 수행할 수 있습니다.

이것은 아마도 가장 효율적인 방법은 아니지만 다른 사람이 더 나은 솔루션을 가지고 있다면 알려주십시오.


Ruby에서는 page.execute_scriptJavaScript 변수를 평가하는 데 사용할 수 있습니다 (웹 브라우저의 범위에서 액세스할 수 있는 경우). 여기 자바에도 비슷한 방법이 있는 것 같습니다 .

편집: 이것은 Jasmine 과 같은 JavaScript 단위 테스트 프레임워크에 더 적합한 사용 사례일 수 있습니다 .


다음 작업만 하면 됩니다.

Object val = js.executeScript("return returnFoo();");

그것은 당신이 찾고있는 것을 줄 것입니다.


No JavaScript functions need be defined. Nor is alert() needed.

Object result = js.executeScript("return globalVar");

For Python:

result = driver.execute_script("return globalVar")

The below lines of code perfectly worked for me ...

JavascriptExecutor js = (JavascriptExecutor ) getDriver();
String s=js.executeScript("return window.var.var_type").toString();
System.out.println(s);

ReferenceURL : https://stackoverflow.com/questions/13994393/reading-javascript-variables-using-selenium-webdriver

반응형