Selenium에서 페이지로드 대기


답변:


138

다음 코드를 사용하여 페이지로드를 확인할 수도 있습니다.

IWait<IWebDriver> wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver, TimeSpan.FromSeconds(30.00));

 wait.Until(driver1 => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"));

22
이와 같은 것이 내장되어 있다고 생각할 것입니다. 페이지로드를 기다리는 것은 웹에서 매우 일반적입니다.
— PRMan

19
이것이 실제로 항상 작동합니까? 어쩌면 임 코드에서 무언가를 잃어 버렸지 만 돔이 준비 상태가되기를 기다리고 있습니다. 그러나 코드가 너무 빨리 실행되면 이전 페이지가 아직 언로드되지 않고 여전히 이전 페이지에 있어도 true를 반환한다는 점을 고려하십시오. 현재 페이지가 언로드 될 때까지 기다린 다음 위의 코드를 호출하면됩니다. 페이지 언로드를 감지하는 방법은 현재 페이지에서 웹 요소를 가져 와서 오래 될 때까지 기다리는 것입니다. obeythetestinggoat.com/…
— George 조지

6
참고로-위의 내용조차도 페이지가 완성되었다는 보장은하지 않습니다. 단지 돔이 준비되었다는 것입니다. 모든 dojo / jquery는 여전히 페이지에서 요소를 동적으로 작성 중일 수 있으므로 상호 작용하기 전에 먼저 동적 요소를 기다려야 할 수 있습니다.
— George

3
이 방법은 DOM 만 검사합니다. Ajax 또는 AngularJS를 사용하는 경우 document.readyState에서 감지 할 수없는 비동기 호출이 있기 때문에 작동하지 않습니다.
— Homewrecker

3
이것은 C # 코드입니다. 이것은 자바 작동하지 않습니다, 그리고 질문에 대해 질문 자바 .
— Kingamere 2019

89

WebDriverWait 클래스 사용

여기 참조

당신은 어떤 요소를 보여줄 것으로 기대할 수 있습니다. C #과 같은 것 :

WebDriver _driver = new WebDriver();
WebDriverWait _wait = new WebDriverWait(_driver, new TimeSpan(0, 1, 0));

_wait.Until(d => d.FindElement(By.Id("Id_Your_UIElement"));

이것은 훌륭하게 작동했습니다. 문제를 해결하는 아주 좋은 현대적인 방법입니다.
— CrazyDart

3
@ EmmanuelAngelo.R TimeSpan 은 .Net 데이터 구조입니다.
— rjzii

12
페이지에 어떤 요소가 있는지 모르는 경우 어떻게해야합니까?
— JustGoscha

3
이것은 전체 페이지가 아닌 특정 요소의 로딩을 기다릴 것입니다.
— xyz

1
이것은 요소가 완전히로드되거나 질문에 대답하지 않는다는 것을 전혀 보장하지는 않습니다. 누구나 어떻게 이것에 공감할 수 있습니까?
— Boris D. Teoharov

36

드라이버의 암시 적 대기를 설정 한 다음 findElement로드 된 페이지에있을 것으로 예상되는 요소 에서 메소드 를 호출 하면 WebDriver는 요소를 찾거나 시간 종료 값에 도달 할 때까지 해당 요소를 폴링합니다.

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

출처 : 암시 적 대기


3
페이지로드를 기다리는 데 도움이되지 않습니다.
— xyz

그것은 예외를 일으키기 전에 10 초 동안 무언가를 시도한다는 것을 의미합니다. 10 초의 지연이 있는지 확인할 수 없습니다.
— skysign

1
@ xyz-왜 도움이되지 않습니까?
— MasterJoe2

@ testerjoe2 특정 요소를 찾을 때까지 기다립니다. 페이지로드를 기다리는 방법에 대한 질문입니다.
— xyz

35

일반적으로 Selenium 2.0의 경우 웹 드라이버는 페이지가로드 된 것으로 판단되면 호출 코드로 제어를 반환해야합니다. 그렇지 않은 waitforelemement경우을 호출 할 수 있습니다. 호출 findelement은 발견되거나 시간 초과 될 때까지 라운드 호출을 순환 합니다 (시간 초과를 설정할 수 있음).


2
바울의 대답에 추가하십시오. stackoverflow.com/questions/5858743/… 도 확인하십시오 .
— 9ikhan

27
불행히도 Selenium 2는 모든 경우에 페이지가로드 될 때까지 기다리지 않습니다. 예를 들어 WebElement : click ()은 기다리지 않으며 이는 속하는 Javadoc에서 명시 적으로 언급됩니다. 그러나 새 페이지를로드 할 수있는 방법을 알려주지 않습니다. If click() causes a new page to be loaded via an event or is done by sending a native event (which is a common case on Firefox, IE on Windows) then the method will not wait for it to be loaded and the caller should verify that a new page has been loaded.
— Sebi

에서 문서 로드가 완료 될 때까지 방법이 차단됩니다 .. 그리고 ...
— XYZ

2
@ Karna : 그렇습니다. 이론적으로 그것은 항상 그리고 실제로 대부분의 시간을 보냈습니다. 당시 Selenium을 사용하면 페이지로드가 완료되었다고 생각했지만 그렇지 않은 경우가 있음을 강조했습니다. 나는 최근에 셀레늄을 사용하지 않았으므로 여전히 그렇지 않을 수도 있습니다.
— Paul Hadfield

3
동의합니다 : 특히 인터넷 익스플로러 드라이버는 버그가 있으며 페이지가 여전히로드 되더라도 즉시 제어를 반환합니다. 내 경우에는 JavascriptExecutordocument.readyState가 "완료"되기를 기다리는을 사용하여 대기를 추가했습니다 . 셀레늄에서 브라우저로의 왕복으로 인해 경쟁 조건이 완화되고이 "항상"작동합니다. 페이지가로드 될 것으로 예상되는 "click ()"후에는 준비 상태를 명시 적으로 (WebDriverWait 사용) 기다립니다. ]
— dmansfield

22

루비 구현 :

wait = Selenium::WebDriver::Wait.new(:timeout => 10)
wait.until {
    @driver.execute_script("return document.readyState;") == "complete" 
}

17
Python 해당 항목 : WebDriverWait (driver, 10) .until (lamdda d : d.execute_script ( 'return document.readyState') == 'complete')
— blaze

2
파이썬은 위의 코드를 사용하지만이 줄을 잊지 마십시오 .. | selenium.webdriver.support.ui에서 가져 오기 WebDriverWait
— t3dodson

페이지가 완전히로드되지 않았을 때 요소를 클릭하는 데 문제가있었습니다. 파이썬에서 time.sleep (30)을 시도했습니다. 효과가있었습니다. 그래도 항상 최대 30 초 동안 기다립니다. 그런 다음 다음 코드를 시도해 보았으므로 이제 더 효율적입니다. WebDriverWait (driver, 10) .until (lambda d : driver.find_element_by_xpath ( "// div [. = 'Administration']" ".. click ())
— Riaz Ladhani

20

System.out라인을 제거 할 수 있습니다 . 디버그 목적으로 추가됩니다.

WebDriver driver_;

public void waitForPageLoad() {

    Wait<WebDriver> wait = new WebDriverWait(driver_, 30);
    wait.until(new Function<WebDriver, Boolean>() {
        public Boolean apply(WebDriver driver) {
            System.out.println("Current Window State       : "
                + String.valueOf(((JavascriptExecutor) driver).executeScript("return document.readyState")));
            return String
                .valueOf(((JavascriptExecutor) driver).executeScript("return document.readyState"))
                .equals("complete");
        }
    });
}

이 팁에 감사드립니다. SeleniumHelper에 추가합니다. cf. javabox
— boly38

17

이러한 모든 솔루션은 특정 경우에 적합하지만 두 가지 가능한 문제 중 하나 이상이 발생합니다.

  1. 그것들은 충분히 일반적이지 않습니다-그들은 당신이 당신이 가고있는 페이지에 대해 특정 조건이 참임을 미리 알고 싶어합니다 (예 : 일부 요소가 표시됩니다)

  2. 이전 페이지와 새 페이지에 실제로 존재하는 요소를 사용하는 경쟁 조건에 개방적입니다.

파이썬 에서이 문제를 피하는 일반적인 솔루션에 대한 나의 시도는 다음과 같습니다.

먼저, 일반적인 "대기"함수 (원하는 경우 WebDriverWait를 사용하면 추악합니다) :

def wait_for(condition_function):
    start_time = time.time()
    while time.time() < start_time + 3:
        if condition_function():
            return True
        else:
            time.sleep(0.1)
    raise Exception('Timeout waiting for {}'.format(condition_function.__name__))

다음으로 솔루션은 셀레늄이 최상위 <html>요소를 포함하여 페이지의 모든 요소에 대해 (내부) id 번호를 기록한다는 사실에 의존합니다 . 페이지를 새로 고치거나로드하면 새 ID를 가진 새로운 html 요소가 표시됩니다.

예를 들어, "my link"라는 텍스트가있는 링크를 클릭한다고 가정하면 다음과 같습니다.

old_page = browser.find_element_by_tag_name('html')

browser.find_element_by_link_text('my link').click()

def page_has_loaded():
    new_page = browser.find_element_by_tag_name('html')
    return new_page.id != old_page.id

wait_for(page_has_loaded)

더 파이썬적이고 재사용 가능한 일반 도우미를 위해 컨텍스트 관리자를 만들 수 있습니다.

from contextlib import contextmanager

@contextmanager
def wait_for_page_load(browser):
    old_page = browser.find_element_by_tag_name('html')

    yield

    def page_has_loaded():
        new_page = browser.find_element_by_tag_name('html')
        return new_page.id != old_page.id

    wait_for(page_has_loaded)

그리고 거의 모든 셀레늄 상호 작용에 사용할 수 있습니다.

with wait_for_page_load(browser):
    browser.find_element_by_link_text('my link').click()

방탄이라고 생각합니다! 어떻게 생각해?

블로그 게시물에 대한 자세한 정보는 여기


솔루션을 구현하는 Java 코드를 더 구체적으로 다시 검색하기 전에 웹 페이지를 읽었습니다. 아무것도 지금까지 ...
— 앤드류 로리엔

11

클래스 : ExpectedConditions를 사용하여 웹 페이지에 요소가 표시 될 때까지 명시 적으로 기다렸다가 추가 조치를 취할 수 있습니다.

ExpectedConditions클래스를 사용하여 요소가 표시되는지 확인할 수 있습니다.

WebElement element = (new WebDriverWait(getDriver(), 10)).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("input#houseName")));

ExpectedConditions class Javadoc확인할 수있는 모든 조건 목록을 참조 하십시오.


11

Java 7에 대한 Imran의 답변은 다시 시작되었습니다.

    WebDriverWait wait = new WebDriverWait(driver, 30);

    wait.until(new ExpectedCondition<Boolean>() {
        public Boolean apply(WebDriver wdriver) {
            return ((JavascriptExecutor) driver).executeScript(
                "return document.readyState"
            ).equals("complete");
        }
    });

10

이것은 WebDriver의 심각한 한계 인 것 같습니다. 분명히 요소를 기다리는 것은 페이지가로드되는 것을 의미하지는 않습니다. 특히 DOM이 완전히 빌드되고 (준비 상태) JS가 여전히 실행 중이고 CSS 및 이미지가 여전히로드 될 수 있습니다.

가장 간단한 해결책은 모든 것이 초기화 된 후 onload 이벤트에 JS 변수를 설정하고 Selenium 에서이 JS 변수를 확인하고 기다리는 것입니다.


사이트를 수정하는 것이 간단합니다!
— reinierpost

예, JavascriptExecutor를 사용하여 jQuery.js를 실행하면 jQuery로드 이벤트에 액세스 할 수 있습니다. 이것이 필요한 경우는 드물다. 표준 웹 드라이버는 98 %의 적절한 대기 시간을 수행 할 수있는 충분한 전원을 가지고 있습니다.
— djangofan

@ djangofan은 그 예를 보는 것이 좋을 것입니다 ... 저는 프론트 엔드 사람이므로 JavascriptExecutor가 어디에서 어떻게 사용되는지 확실하지 않습니다.
— BradGreens

@BradGreens-좋아, 여기 내 프로젝트를보십시오 : github.com/djangofan/jquery-growl-selenium-example . 이 예제를 완료 할 대역폭이 있다면 jQuery가 제대로 작동하더라도 jGrowl을 해당 테스트 프로젝트에서 작동시킬 수는 없습니다.
— djangofan

1
@BradGreens djangofan의 의견 외에도 여기에 내 대답을 참조하십시오 : stackoverflow.com/a/24638792/730326
— jmathew

9

특정 요소가로드되기를 기다리려면 다음에서 isDisplayed()메소드를 사용할 수 있습니다 RenderedWebElement.

// Sleep until the div we want is visible or 5 seconds is over
long end = System.currentTimeMillis() + 5000;
while (System.currentTimeMillis() < end) {
    // Browsers which render content (such as Firefox and IE) return "RenderedWebElements"
    RenderedWebElement resultsDiv = (RenderedWebElement) driver.findElement(By.className("gac_m"));

    // If results have been returned, the results are displayed in a drop down.
    if (resultsDiv.isDisplayed()) {
      break;
    }
}

( 5 분 시작 안내서의 예 )


4
1 년 후 (현재 Selenium 버전 2.23.1) RenderedWebElement에는 API 가 없습니다 . 그러나 isDisplayed()이제 방법은에서 직접 사용할 수 있습니다 WebElement.
— Petr Janeček 2016 년

1
폴링은 피할 수있을 때 끔찍합니다.
— reinierpost

8

이 조건이 주어질 때까지이 대기에서 명시 적으로 대기 또는 조건부 대기.

WebDriverWait wait = new WebDriverWait(wb, 60);
wait.until(ExpectedConditions.elementToBeClickable(By.name("value")));

모든 웹 요소를 60 초 동안 기다립니다.

주어진 시간까지 페이지의 모든 요소를 ​​암시 적으로 기다리십시오.

driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);

모든 웹 요소를 60 초 동안 기다립니다.


5

주어진 시간까지 페이지의 모든 요소를 ​​암시 적으로 기다리십시오.

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

30 초 동안 페이지의 모든 요소를 ​​기다립니다.

다른 대기는 지정된 대기 시간까지이 대기에서 명시 적으로 대기 또는 조건부 대기입니다.

WebDriverWait wait = new WebDriverWait(driver, 40);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));

id에서 페이지가로드 되 자마자 페이지에 표시되는 정적 요소 ID를 제공하십시오.


4

로드 할 페이지에서 다음에 상호 작용할 요소를 일반적으로 알고 있으므로 술어가 첫 번째 선택이 아니라는 것에 놀랐습니다. 내 접근 방식은 항상 waitForElementByID(String id)and waitForElemetVisibleByClass(String className)등의 술어 / 함수를 구축 한 다음 페이지로드 또는 페이지 내용 변경을 위해 필요할 때마다 사용하고 재사용합니다.

예를 들어

내 테스트 수업에서 :

driverWait.until(textIsPresent("expectedText");

내 시험 수업 부모님 :

protected Predicate<WebDriver> textIsPresent(String text){
    final String t = text;
    return new Predicate<WebDriver>(){
        public boolean apply(WebDriver driver){
            return isTextPresent(t);
        }
    };
}

protected boolean isTextPresent(String text){
    return driver.getPageSource().contains(text);
}

이것은 많은 것처럼 보이지만 반복적으로 확인해야하며 시간 초과 전에 최종 대기 시간과 함께 확인 빈도 간격을 설정할 수 있습니다. 또한 이러한 방법을 재사용 할 것입니다.

이 예제에서 상위 클래스는 및를 정의하고 시작 WebDriver driver했습니다 WebDriverWait driverWait.

이게 도움이 되길 바란다.


이것은 나를 도와줍니다! 이 훌륭한 샘플에 감사드립니다. SeleniumHelper에 추가합니다. cf. javabox
— boly38

4

WebDriver에 Java 바인딩을 사용할 때 페이지로드를 기다리는 가장 좋은 방법은 PageFactory와 함께 페이지 오브젝트 디자인 패턴을 사용하는 것입니다. 이를 통해 AjaxElementLocatorFactory어느 요소 를 사용하든 간단히 모든 요소를 ​​전역 적으로 기다리는 역할을합니다. 드롭 박스 또는 복잡한 자바 스크립트 전환과 같은 요소에는 제한이 있지만 필요한 코드의 양을 크게 줄이고 테스트 시간을 단축합니다. 이 블로그 포스트에서 좋은 예를 찾을 수 있습니다. 핵심 Java에 대한 기본 이해가 가정됩니다.

http://startingwithseleniumwebdriver.blogspot.ro/2015/02/wait-in-page-factory.html


4

NodeJS 솔루션 :

Nodejs 에서는 약속을 통해 얻을 수 있습니다 ...

이 코드를 작성하면 다음에 도달 할 때 페이지가 완전히로드되었는지 확인할 수 있습니다.

driver.get('www.sidanmor.com').then(()=> {
    // here the page is fully loaded!!!
    // do your stuff...
}).catch(console.log.bind(console));

이 코드를 작성하면 탐색하고 셀레늄이 3 초 동안 대기합니다.

driver.get('www.sidanmor.com');
driver.sleep(3000);
// you can't be sure that the page is fully loaded!!!
// do your stuff... hope it will be OK...

Selenium 문서에서 :

this.get (url) → Thenable

주어진 URL로 이동하도록 명령을 예약합니다.

문서의 로드 가 완료 되면 해결 될 가능성을 리턴합니다 .

셀레늄 문서 (Nodejs)


4

다음은 현재 가장 많이 답변 된 답변 의 Java 8 버전입니다 .

WebDriverWait wait = new WebDriverWait(myDriver, 15);
wait.until(webDriver -> ((JavascriptExecutor) myDriver).executeScript("return document.readyState").toString().equals("complete"));

객체 myDriver는 어디에 있습니까 WebDriver(앞에서 선언).

참고 :이 메소드 ( document.readyState)는 DOM 만 검사합니다.


4

자바 스크립트를 사용하여 페이지가로드되지 않을 때까지 기다립니다.

public static boolean isloadComplete(WebDriver driver)
{
    return ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("loaded")
            || ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("complete");
}

나는 무효에 대한 부울을 변경하지만, 크롬에서 작동하지 않습니다
— nosequeweaponer

3
/**
 * Call this method before an event that will change the page.
 */
private void beforePageLoad() {
    JavascriptExecutor js = (JavascriptExecutor) driver;
    js.executeScript("document.mpPageReloaded='notYet';");
}

/**
 * Call this method after an event that will change the page.
 * 
 * @see #beforePageLoad
 * 
 *      Waits for the previous page to disappear.
 */
private void afterPageLoad() throws Exception {
    (new WebDriverWait(driver, 10)).until(new Predicate<WebDriver>() {

        @Override
        public boolean apply(WebDriver driver) {
            JavascriptExecutor js = (JavascriptExecutor) driver;
            Object obj = js.executeScript("return document.mpPageReloaded;");
            if (obj == null) {
                return true;
            }
            String str = (String) obj;
            if (!str.equals("notYet")) {
                return true;
            }
            return false;
        }
    });
}

문서의 일부만 변경되는 경우 문서에서 요소로 변경할 수 있습니다.

이 기술은 sincebasic의 답변에서 영감을 받았습니다.


3

SeleniumWaiter :

import com.google.common.base.Function;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.WebDriverWait;

public class SeleniumWaiter {

      private WebDriver driver;

      public SeleniumWaiter(WebDriver driver) {
           this.driver = driver;
      }

      public WebElement waitForMe(By locatorname, int timeout){
           WebDriverWait wait = new WebDriverWait(driver, timeout);
           return wait.until(SeleniumWaiter.presenceOfElementLocated(locatorname));
      }

      public static Function<WebDriver, WebElement> presenceOfElementLocated(final By locator) {
            // TODO Auto-generated method stub
            return new Function<WebDriver, WebElement>() {
                 @Override
                 public WebElement apply(WebDriver driver) {
                      return driver.findElement(locator);
                 }
            };
      }
 }

그리고 당신에게 그것을 사용 :

_waiter = new SeleniumWaiter(_driver);

try {
   _waiter.waitForMe(By.xpath("//..."), 10);
} 
catch (Exception e) {
   // Error
}

3

페이지를로드하는 데 20 초 이상이 걸리면 아래 예제에서 pageeLoadTimeout 시간을 설정하기 위해 기존의 방법을 사용할 수 있습니다. 페이지 다시로드 예외가 발생합니다.

 WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().pageLoadTimeout(20, TimeUnit.SECONDS)

2

element.click ()과 같은 작업을 수행하기 전에 웹 페이지에 요소가 표시 될 때까지 명시 적으로 기다릴 수 있습니다.

driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
  .until(new ExpectedCondition<WebElement>(){
        @Override
        public WebElement apply(WebDriver d) {
        return d.findElement(By.id("myDynamicElement"));
}});

이것은 비슷한 시나리오에 사용 된 것으로 잘 작동합니다.


페이지에 많은 아약스가 없다면 드라이버 .get은 onload 함수가 코드를 반환하기 전에 완료 될 때까지 기다린다고 생각합니다.
— goh

2

내 간단한 방법 :

long timeOut = 5000;
    long end = System.currentTimeMillis() + timeOut;

        while (System.currentTimeMillis() < end) {

            if (String.valueOf(
                    ((JavascriptExecutor) driver)
                            .executeScript("return document.readyState"))
                    .equals("complete")) {
                break;
            }
        }

2

내가 본 가장 좋은 방법은 stalenessOfExpectedCondition 을 사용 하여 이전 페이지가 오래 될 때까지 기다리는 것입니다.

예:

WebDriver driver = new FirefoxDriver();
WebDriverWait wait = new WebDriverWait(driver, 10);

WebElement oldHtml = driver.findElement(By.tagName("html"));
wait.until(ExpectedConditions.stalenessOf(oldHtml));

기존 HTML 태그가 오래 될 때까지 10 초 동안 기다렸다가 발생하지 않으면 예외가 발생합니다.


1
부실한 WebElement는 새 페이지가로드되었음을 의미하지 않습니다.
— Corey Goldberg

그러나 이전 페이지 언로드가 완료되었음을 의미합니다. 내 경험상 이전 페이지가 언로드 된 시점 또는 어떤 이유로 중단되었는지 아는 것이 중요합니다.
— forresthopkinsa

물론, 나는 일반적으로 stalenessOf를 다른 테스트와 함께 사용하여 전체 언로드 /로드 프로세스를 얻습니다.
— forresthopkinsa

2

node + selenium-webdriver (현재 버전은 3.5.0입니다)를 사용합니다. 내가 이것을 위해하는 일은 :

var webdriver = require('selenium-webdriver'),
    driver = new webdriver.Builder().forBrowser('chrome').build();
;
driver.wait(driver.executeScript("return document.readyState").then(state => {
  return state === 'complete';
}))

2

대기를 사용할 수 있습니다. 기본적으로 셀레늄에는 두 가지 유형의 대기가 있습니다.

  • 암시 적 대기
  • 명시 적 대기

-암시 적 대기

이것은 매우 간단합니다. 아래 구문을 참조하십시오.

driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);

-명시 적 대기

주어진 조건이 발생할 때까지이 대기에서 명시 적으로 대기 또는 조건부 대기입니다.

WebDriverWait wait = new WebDriverWait(driver, 40);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));

와 같은 다른 속성을 사용할 수 있습니다 visblityOf().visblityOfElement()



2

내 경우에는 다음을 사용하여 페이지로드 상태를 알았습니다. 우리의 응용 프로그램에서 gif 가로 드되고 스크립트에서 원치 않는 대기 시간을 제거하기 위해 다음과 같이 듣습니다.

public static void processing(){ 
    WebDriverWait wait = new WebDriverWait(driver, 30);
    wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@id='Msgpanel']/div/div/img")));
    wait.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//div[@id='Msgpanel']/div/div/img")));
}

xpath가 HTML DOM에서 gif를 찾는 위치. 이 후, 당신은 또한 당신의 행동 방법 클릭을 구현할 수 있습니다.

public static void click(WebElement elementToBeClicked){
    WebDriverWait wait = new WebDriverWait(driver, 45);
    wait.until(ExpectedConditions.visibilityOf(element));
    wait.until(ExpectedConditions.elementToBeClickable(element)); 
    wait.ignoring(NoSuchElementException.class).ignoring(StaleElementReferenceException.class); elementToBeClicked.click(); 
 }

2

이 모든 답변에는 너무 많은 코드가 필요합니다. 이것은 일반적인 것으로 간단한 것이어야합니다.

왜 웹 드라이버로 간단한 자바 스크립트를 주입하고 확인하지 않습니까? 이것은 내 웹 스크래퍼 클래스에서 사용하는 방법입니다. 자바 스크립트는 js를 모르더라도 매우 기본입니다.

    def js_get_page_state(self):        
    """
    Javascript for getting document.readyState
    :return: Pages state.

    More Info: https://developer.mozilla.org/en-US/docs/Web/API/Document/readyState
    """
    ready_state = self.driver.execute_script('return document.readyState')
    if ready_state == 'loading':
        self.logger.info("Loading Page...")
    elif ready_state == 'interactive':
        self.logger.info("Page is interactive")
    elif ready_state == 'complete':
        self.logger.info("The page is fully loaded!")
    return ready_state

1

클릭 후 Selenium이 페이지로드를 기다리도록하는 방법 은 다음과 같은 흥미로운 접근 방식을 제공합니다.

  1. WebElement이전 페이지 의에 대한 참조를 저장 하십시오.
  2. 링크를 클릭하십시오.
  3. WebElement까지 처리 될 때까지 작업을 계속 호출하십시오 StaleElementReferenceException.

샘플 코드 :

WebElement link = ...;
link.click();
new WebDriverWait(webDriver, timeout).until((org.openqa.selenium.WebDriver input) ->
{
    try
    {
        link.isDisplayed();
        return false;
    }
    catch (StaleElementReferenceException unused)
    {
        return true;
    }
});

좋은 생각! 성공적인 페이지로드, 성공적인 페이지 언로드 (더 나은 용어가 없음)의 반대를 점검하여이 상황을 해결하려고 생각한 적이 없습니다. 이것이 최상의 옵션인지 여부는 StaleElementReferenceException이 성공적인로드를 기다리는 것보다 시간이 덜 걸리는지 여부에 따라 결정됩니다. 그럼에도 불구하고 다른 좋은 방법입니다.
— Joseph Orlando

4
현재 페이지가로드되었는지 여부를 알려주지 않고 마지막 페이지 (특히 하나의 요소)가 언로드 되었는지 여부를 알려줍니다 . 여전히 현재 페이지가로드 될 때까지 기다려야합니다. BTW, 위의 코드를로 바꿀 수 있습니다 new WebDriverWait(driver, 10).until(ExpectedConditions.stalenessOf(element)).
— JeffC
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.