2009-08-19 5 views
13

QWebFrameQWebPage은 모두 웹 페이지가 완전히로드 될 때를 감지하는 데 사용할 수있는 void loadFinished(bool ok) 신호를 가지고 있습니다. 문제는 웹 페이지에 비동기 적으로로드 된 일부 컨텐츠가있는 경우입니다 (ajax). 이 경우 페이지가 완전히로드 된 시점을 확인하는 방법은 무엇입니까?QtWebKit을 사용할 때 웹 페이지가로드되는시기를 아는 방법?

+0

어떻게 완전히로드를 정의합니까? 아약스 코드가 현재 실행되고 있지 않을 때 페이지가 완전히로드 되었습니까? (앞으로 아약스 코드가 실행될지라도?) 앞으로 아약스 코드가 실행되지 않을 때 페이지가 완전히로드됩니까? 이 정보를 가지고 다르게 무엇을 하시겠습니까? (왜 중요합니까?) – Bill

+0

제 경우에는 ajax 호출이 onload 이벤트에서 호출되고 있습니다. 끝나면 완전히로드 된 페이지를 생각합니다. –

답변

12

실제로 이런 짓을하지 않은,하지만 난 당신이 QNetworkAccessManager를 사용하여 솔루션을 달성 할 수있을 것 같아요.

networkAccessManager() 기능을 사용하여 QWebPage에서 QNetworkAccessManager를 가져올 수 있습니다. QNetworkAccessManager에는 QWebPage 인스턴스가 파일을 요청할 때마다 발생하는 finished (QNetworkReply * reply)이라는 신호가 있습니다.

finished 신호는 QNetworkReply 인스턴스를 제공하며 요청을 식별하기 위해 원본 요청의 복사본을 얻을 수 있습니다.

finished 신호에 연결할 슬롯을 만들고 전달 된 QNetworkReply의 메소드를 사용하여 방금 다운로드가 완료된 파일을 확인하고 Ajax 요청 인 경우 수행해야하는 모든 작업을 수행하십시오.

내 유일한 경고는 내가 이전에 해본 적이 없으므로 100 % 확신 할 수 없다는 것입니다.

QWebFrame의 메소드를 사용하여 페이지의 객체 모델에 객체를 삽입하고 Ajax 요청이 완료되면 객체를 알리는 일부 JavaScript를 삽입 할 수도 있습니다. 이것은 약간 힘든 방법이지만 꼭 작동해야합니다.

편집 :

두 번째 옵션이 나에게 좋을 것 같습니다. 워크 플로우는 다음과 같습니다.

슬롯을 QWebFrame :: javascriptWindowObjectCleared() 신호에 연결하십시오. 이 시점에서 QWebFrame :: evaluateJavascript()를 호출하여 다음과 비슷한 코드를 추가합니다. window.onload = function() {// 페이지가 완전히로드되었습니다.}

해당 함수에 필요한 코드를 입력하십시오. QWebFrame :: addToJavaScriptWindowObject()를 통해 QObject를 페이지에 추가 한 다음 해당 객체에서 함수를 호출 할 수 있습니다. 이 코드는 페이지가 완전히로드 될 때만 실행됩니다.

이 질문에 대한 답변입니다.

+0

당신의 사고 방식이 좋습니다. 그것은 지금 내가하고있는 일이며 지금까지 계속 노력해 왔습니다. 자, finished() 신호를받은 후에 js 함수를 호출하고 아무런 효과가 없다. 문제는있다. 내 페이지를 볼 수있는 양식의 단추를 사용하여 동일한 js 함수를 수동으로 호출하면 필요한대로 작동합니다. 추가 데이터에 대해 묻는 게시물을 보냅니다. QWAM의 finished() 신호를 기다리는 것은 QWebFrame이 DOM을 수정하고 js 호출을 처리 할 준비가되기 전에 다른 일을해야한다는 데이터를받은 후에 충분하지 않다고 생각합니다. 이를 반영하여 답변을 업데이트하십시오. –

+0

달성하고자하는 목표에 대해 더 자세히 알려 줄 수 있습니까? 1) 페이지를로드합니다 (QWebView-> load() 또는 다른 방법을 통해) 2) 페이지 콘텐츠 (HTML)가 수신되면 QNAM이 실행됩니다 finished() 신호 3) JS 파일, CSS 및 이미지를 포함한 전체 페이지로드가 완료되면 QWebPage 객체가 loadFinished() 신호를 발생합니다. 4) 나중에 약간의 데이터가 Ajax를 통해로드됩니다. # 4 번이 언제 일어 났는지 알고 싶습니까? 더 설명해 주시면 귀하의 질문에 완전히 답변 드릴 수 있습니다. –

+0

광고 1. 정확하지 않습니다. 나는 렌더링 단계를 전혀 필요로하지 않기 때문에 QWebFrame :: load를 사용하고 있습니다. 그러나 현재 ** QWebView :: setPage를 사용하여 페이지가 어떻게 보이는지 볼 수 있지만 디버깅 목적으로 만 사용됩니다. ad 2. 나는 혼자 html에 관심이 없기 때문에 여기서이 신호를 사용하지 않는다. 광고 3. 예. 광고 4. 예. 이 아약스 호출의 순간은 엄격하게 정의됩니다. 사용자가 데이터 행의 일부를 클릭하는 순간에 발생합니다. 여기 내 문제가있다. evaluateJavaScript와 동일한 js 함수를 호출하고 아무 일도 일어나지 않습니다. 전송중인 네트워크 요청이 없습니다 (QNAM이 보내는 모든 요청을 모니터링하고 있습니다). TBC –

1

초기 html/images/etc가 로딩을 완료하면 그만입니다. 입니다. 몇 가지 추가 데이터, 페이지 뷰 또는 기타 사실을 얻으려면 일부 자바 스크립트를 사용하기로 결정하면이 사실이 변경되지 않습니다.

당신이 여기에서하고 싶다고 생각하는 것은 페이지의 스크립트에서 호출 할 수있는 뷰에 대한 QtScript 개체/인터페이스를 노출하여 결정한 후에는 효과적으로 C++에 "콜백"을 제공하는 것입니다. 페이지 스크립트)를 "완전히로드했습니다". 이 당신이 시도 할 수있는 방향을 제시하는 데 도움이

희망 ...

+0

내 페이지가 아니므로 스크립트/코드를 호출 할 수 없으므로 여기에 포함 된 스크립트를 변경할 수 없습니다. Ajax 호출은 데이터 행을 클릭하여 트리거되며 (프로그래밍 방식으로 이러한 클릭을 시뮬레이션하고 있음) 추가 데이터를 검색합니다. 로드 된 후에이 데이터를 읽어야하므로로드가 완료 될 때를 알아야합니다. –

+0

Qt를 사용하여 일종의 크로스 사이트 스크립팅을 수행하려고하십니까? 나는 그것이 작동 할 것이라고 생각하지 않는다. 마음에 떠오르는 유일한 생각은 HTTP 상태 자체를 감시 할 수 있다는 것입니다.로드 된 이벤트 이후에 "감시"하기 시작할 것입니다. – Shaun

+0

왜 그것이 효과가 없을 것이라고 생각합니까? QtWebKit을 사용하면 페이지의 DOM 및 JavaScript에 대한 모든 액세스 권한을 가지며 자신의 JavaScript를 호출 할 수도 있습니다. 네트워크 계층에 대한 전체 액세스 권한이 있습니다. 무엇이 더 필요합니까? HTTP 상태는 무엇이 필요합니까? 그것은 매우 낮은 수준의 물건입니다. 내가 원했고 필요한 것은 사용자가 자신의 정상적인 탐색 중에 가지고있는 것과 동일한 환경에서 사용자의 행동을 시뮬레이션 할 수 있어야한다는 것입니다. QtWebKit에서보기에 부족한 기능은 무엇입니까? –

1

특정 요소의로드를 확인하려면 QTimer을 사용할 수 있습니다.파이썬에서 이런 식으로 뭔가 :

@pyqtSlot() 
def on_webView_loadFinished(self): 
    self.tObject = QTimer() 
    self.tObject.setInterval(1000) 
    self.tObject.setSingleShot(True) 
    self.tObject.timeout.connect(self.on_tObject_timeout) 
    self.tObject.start() 

@pyqtSlot() 
def on_tObject_timeout(self): 
    dElement = self.webView.page().currentFrame().documentElement() 
    element = dElement.findFirst("css selector") 
    if element.isNull(): 
     self.tObject.start() 

    else: 
     print "Page loaded" 
0

영업이 지연 AJAX 요청을 할 예정이었습니다뿐만 아니라 매우 짧은 시간 지연 문제를 해결하는 이유도 설명하는 또 다른 이유가있을 수 있다고 생각.

https://bugreports.qt-project.org/browse/QTBUG-37377

연결을 대기 사용하여 완벽한 loadingFinished() 신호가 연결되어 있어야이 문제를 해결하려면 다음과 같이 설명 된 동작을 일으키는 버그가 있습니다.

+0

제가 올바르게 기억한다면, 제 경우에는 ** 페이지가로드 된 직후 Ajax 호출이 발생했기 때문에 ** 문제가있었습니다. 그러나 'loadFinished()'시그널이 출력되기 전에 어떤 것이 완료되었는지를 알지 못하기 때문에 Rob Knight가 제안한 것처럼 window.onload를 사용해야합니다. 어쨌든 QtWebKit의 개발이 QtWebEngine에 유리하게 되었기 때문에 나는 어떤 변화도 의지하지 않을 것입니다. –

+0

동의합니다. 이 문제는 더 이상 해결되지 않습니다. 그러나이 해결 방법은 여전히 ​​유용 할 수 있습니다. 나는 이것이 주어진 증상의 다른 가능한 이유라고 말하면서 나의 글을 편집했다. – Silicomancer

관련 문제