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
나는 둘 다 foo
및 returnFoo()
밖을 옮겼다 $(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의 일부 코드가 seleniumGlobal
setter 메서드를 통해 변수를 설정할 때마다 Selenium 테스트를 통해 해당 변수를 호출하고 이에 대한 어설션을 수행할 수 있습니다.
이것은 아마도 가장 효율적인 방법은 아니지만 다른 사람이 더 나은 솔루션을 가지고 있다면 알려주십시오.
Ruby에서는 page.execute_script
JavaScript 변수를 평가하는 데 사용할 수 있습니다 (웹 브라우저의 범위에서 액세스할 수 있는 경우). 여기 자바에도 비슷한 방법이 있는 것 같습니다 .
편집: 이것은 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
'IT이야기' 카테고리의 다른 글
다중 열 기본 키의 NULL 값 (0) | 2021.09.26 |
---|---|
SQL Azure에서 데이터베이스 간에 쿼리할 수 없음 (0) | 2021.09.26 |
파이썬의 정규식 일치에서 문자열을 반환 (0) | 2021.09.26 |
레이블이 지정된 데이터와 레이블이 지정되지 않은 데이터의 차이점 (0) | 2021.09.25 |
Xcode의 임베디드 바이너리는 무엇입니까? (0) | 2021.09.25 |