9

자바 스크립트를 실행하고 반환 값을 얻으려면 Selenium 2의 웹 드라이버를 얻을 수 있지만 비동기식 물건이 너무 많이 발생한다는 것을 알고 있습니다. 자바 스크립트를 다른 방법 대신 Selenium과 대화하고 싶습니다. 나는 약간 수색을하고 이것 같이 아무것도를 찾아 내지 않았다. 사람들은 일반적으로 implicitly_wait을 사용합니까? 그것은 모든 것을 시간을 정하는 것이 불가능하기 때문에 실패 할 것 같습니다. 완전한 예제는 셀레늄이 XHR이 완료되었거나 실행 시간이 불확실한 비동기 애니메이션을 알리는 것입니다.JavaScript가 Selenium 2와 대화 할 수 있습니까?

이것이 가능합니까? 우리는 Saucelabs에서 Python과 함께 Selenium 2를 사용하고 있습니다.

답변

8

execute_async_script() 메서드 (Java에서는 JavascriptExecutor.executeAsyncScript, .NET에서는 IJavaScriptExecutor.ExecuteAsyncScript())를 살펴 봐야 콜백 함수를 기다릴 수 있습니다. 콜백 함수는 JavaScript 함수의 arguments 배열에 자동으로 추가됩니다. 그래서, 당신은 당신이 원하는 조건까지 대기 페이지에 이미 자바 스크립트 함수를 가정하면 다음과 같이 할 수있는 (아래 자바 코드를 C# 및 파이썬 코드는 비슷해야) :

String script = "var callback = arguments[arguments.length - 1];" 
    + "callback(myJavaScriptFunctionThatWaitsUntilReady());"; 

driver.manage().timeouts().setScriptTimeout(15, TimeUnit.SECONDS); 
((JavascriptExecutor)driver).executeAsyncScript(script); 

그것은 수도 더욱 영리 해지고 콜백 함수를 적절한 데이터를 반환하는 이벤트에 직접 전달할 수 있습니다. 프로젝트 JavaDocs에서 executeAsyncScript() 함수에 대한 자세한 정보를 찾을 수 있으며 프로젝트 소스 트리에서 이에 대한 샘플 코드를 찾을 수 있습니다. this file의 테스트에서 XHR을 완료하기를 기다리는 좋은 예가 있습니다.

SauceLabs에서 사용할 수있는 Python 바인딩 버전에서 아직이 기능을 사용할 수 없다면 이전 버전에서 사용할 수있을 것으로 기대됩니다. 틀림없이 어떤 의미에서는 테스트 케이스의 "원하는 상태에 대한 설문 조사"를 JavaScript로 푸시하는 것이지만 테스트가 더 읽기 쉽도록 만들 것입니다.

+1

감사의 말씀입니다. –

2

당신의 앱을 테스트 러너와 대화하기를 원하신다면 틀린 일을하고 싶을 것입니다.

XHR이 끝날 때까지 기다려야하는 경우 회 전자를 표시 한 다음 회 전자가 사라져서 요청이 성공했음을 테스트 할 수 있습니다.

애니메이션과 관련하여 애니메이션이 완료되면 콜백이 애니메이션이 완료되었음을 나타내는 클래스를 추가 한 다음 해당 클래스의 존재 여부를 테스트 할 수 있습니다.

+1

두 경우 모두 타이밍 부분을 무시하고 있습니다. JavaScript는 비동기입니다. 셀레늄 검사를하는 법을 묻는 것이 아닙니다. 검사시기를 묻는 것입니다. 대답하지 않은 질문. 자바 스크립트가 비동기 적이기 때문에 자바 스크립트가 준비되어 있고 자바 스크립트가 언제인지를 아는 것이 가장 좋은시기입니다. 후크가 가장 좋은 방법입니다. 그래서 거기에 무엇입니까? –

+2

Selenium 1과 2에 대한 경험으로 테스트에서 앱의 비동기 호출이 트리거됩니다. 그런 다음 wait_for 명령을 사용하여 요소가 존재할 때까지 기다립니다. Selenium이 존재할 것으로 기대하는 앱을 작성하면 문제가 잘못 처리되고 있다고 생각합니다. 앱은 Selenium이나 다른 테스트 프레임 워크를 신경 써서는 안됩니다. 그렇게하면 앞으로 테스트 주자를 바꿀 수 있습니다. –

+2

아마도 이것은 더 나은 대답 일 것입니다. Selenium에게 비동기 액션을 트리거 한 직후에 확인하라고 지시합니다. 셀레늄은 그 상태가 존재할 때까지 일정 시간 동안 기다릴 것입니다. 할당 된 시간 내에 존재하지 않으면 작업이 실패하여 테스트가 실패해야한다고 가정합니다. –

3

이론적으로는 가능하지만 반대 의견을 제시합니다.

솔루션에는 JavaScript 처리가 완료되면 변수를 true로 설정하는 사이트에서 실행되는 jQuery가있을 수 있습니다.

이 변수가 참이 될 때까지 셀레늄을 getEval을 통해 반복하도록 설정 한 다음 Selenium에서 작업을 수행하십시오.

귀하의 요구 사항을 충족시킬 수 있지만 실제로는 좋지 않습니다. 어떤 이유로 jQuery가 트리거 변수를 true로 설정하지 않거나 (셀프가 예상 한 상태로) 셀레늄이 indefinetly 앉아있을 것입니다. 정말 긴 시간 제한을 넣을 수는 있지만 셀렌이 getEval을 수행하고 특정 요소가 나타날 때까지 기다리는 것과는 다른 점은 무엇입니까?

당신이 솔루션을 과장하려고 노력하는 것처럼 들리면 미래에 더 많은 고통을 느끼게 될 것입니다.

+1

같은 일이 아닌 Selenium과 함께 폴링을 제안하고 있습니다. Selenium이 사이트에 추가 한 내용을 들었는지 궁금합니다. 나는 그것이 놀랍다. 플래시조차도 플래시 외장에이 기능을 제공합니다. –

+1

Selenium은 사이트를 수정하지 않고 단지 DOM과 HTML을 봅니다. 당신이하고 싶은 일을 할 수있는 유일한 방법은 어떻게 든 DOM을 조작 한 다음 Selenium이 DOM을 확인하여 변경을 수행하는 것입니다. 웹 사이트에서 셀렌을 운전할 수 없습니다. – Ardesco

+1

웹 사이트에서 셀렌을 운전할 수 없습니다. 그 때 내 대답입니다. 내 의견으로는 그렇게해야하지만 그렇지 않습니다. 고맙습니다! –

1

셀레늄으로 애니메이션을 테스트하면 웜 캔이 열립니다.이 테스트는 매우 취성이 있으며 오탐 (false positive)이 많습니다.

문제는 호출이 비동기적이고 페이지의 동작을 추적하고 상태를 변경하기 어렵다는 것입니다.

내 경험에 비동기 호출이 너무 빨리 회 전자 결코 표시 될 수 및 페이지의 상태를 전적으로 Selenium 감지 할 수 있습니다 건너 뛸 수 있습니다.

페이지의 상태가 전환되기를 기다리는 것은 테스트를 약하게 만들지 만 가양 성은 완전히 제거 할 수 없습니다.

애니메이션에 대한 수동 테스트를 권장합니다.

관련 문제