QWebFrame
및 QWebPage
은 모두 웹 페이지가 완전히로드 될 때를 감지하는 데 사용할 수있는 void loadFinished(bool ok)
신호를 가지고 있습니다. 문제는 웹 페이지에 비동기 적으로로드 된 일부 컨텐츠가있는 경우입니다 (ajax). 이 경우 페이지가 완전히로드 된 시점을 확인하는 방법은 무엇입니까?QtWebKit을 사용할 때 웹 페이지가로드되는시기를 아는 방법?
답변
실제로 이런 짓을하지 않은,하지만 난 당신이 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를 페이지에 추가 한 다음 해당 객체에서 함수를 호출 할 수 있습니다. 이 코드는 페이지가 완전히로드 될 때만 실행됩니다.
이 질문에 대한 답변입니다.
당신의 사고 방식이 좋습니다. 그것은 지금 내가하고있는 일이며 지금까지 계속 노력해 왔습니다. 자, finished() 신호를받은 후에 js 함수를 호출하고 아무런 효과가 없다. 문제는있다. 내 페이지를 볼 수있는 양식의 단추를 사용하여 동일한 js 함수를 수동으로 호출하면 필요한대로 작동합니다. 추가 데이터에 대해 묻는 게시물을 보냅니다. QWAM의 finished() 신호를 기다리는 것은 QWebFrame이 DOM을 수정하고 js 호출을 처리 할 준비가되기 전에 다른 일을해야한다는 데이터를받은 후에 충분하지 않다고 생각합니다. 이를 반영하여 답변을 업데이트하십시오. –
달성하고자하는 목표에 대해 더 자세히 알려 줄 수 있습니까? 1) 페이지를로드합니다 (QWebView-> load() 또는 다른 방법을 통해) 2) 페이지 콘텐츠 (HTML)가 수신되면 QNAM이 실행됩니다 finished() 신호 3) JS 파일, CSS 및 이미지를 포함한 전체 페이지로드가 완료되면 QWebPage 객체가 loadFinished() 신호를 발생합니다. 4) 나중에 약간의 데이터가 Ajax를 통해로드됩니다. # 4 번이 언제 일어 났는지 알고 싶습니까? 더 설명해 주시면 귀하의 질문에 완전히 답변 드릴 수 있습니다. –
광고 1. 정확하지 않습니다. 나는 렌더링 단계를 전혀 필요로하지 않기 때문에 QWebFrame :: load를 사용하고 있습니다. 그러나 현재 ** QWebView :: setPage를 사용하여 페이지가 어떻게 보이는지 볼 수 있지만 디버깅 목적으로 만 사용됩니다. ad 2. 나는 혼자 html에 관심이 없기 때문에 여기서이 신호를 사용하지 않는다. 광고 3. 예. 광고 4. 예. 이 아약스 호출의 순간은 엄격하게 정의됩니다. 사용자가 데이터 행의 일부를 클릭하는 순간에 발생합니다. 여기 내 문제가있다. evaluateJavaScript와 동일한 js 함수를 호출하고 아무 일도 일어나지 않습니다. 전송중인 네트워크 요청이 없습니다 (QNAM이 보내는 모든 요청을 모니터링하고 있습니다). TBC –
초기 html/images/etc가 로딩을 완료하면 그만입니다. 은입니다. 몇 가지 추가 데이터, 페이지 뷰 또는 기타 사실을 얻으려면 일부 자바 스크립트를 사용하기로 결정하면이 사실이 변경되지 않습니다.
당신이 여기에서하고 싶다고 생각하는 것은 페이지의 스크립트에서 호출 할 수있는 뷰에 대한 QtScript 개체/인터페이스를 노출하여 결정한 후에는 효과적으로 C++에 "콜백"을 제공하는 것입니다. 페이지 스크립트)를 "완전히로드했습니다". 이 당신이 시도 할 수있는 방향을 제시하는 데 도움이
희망 ...
내 페이지가 아니므로 스크립트/코드를 호출 할 수 없으므로 여기에 포함 된 스크립트를 변경할 수 없습니다. Ajax 호출은 데이터 행을 클릭하여 트리거되며 (프로그래밍 방식으로 이러한 클릭을 시뮬레이션하고 있음) 추가 데이터를 검색합니다. 로드 된 후에이 데이터를 읽어야하므로로드가 완료 될 때를 알아야합니다. –
Qt를 사용하여 일종의 크로스 사이트 스크립팅을 수행하려고하십니까? 나는 그것이 작동 할 것이라고 생각하지 않는다. 마음에 떠오르는 유일한 생각은 HTTP 상태 자체를 감시 할 수 있다는 것입니다.로드 된 이벤트 이후에 "감시"하기 시작할 것입니다. – Shaun
왜 그것이 효과가 없을 것이라고 생각합니까? QtWebKit을 사용하면 페이지의 DOM 및 JavaScript에 대한 모든 액세스 권한을 가지며 자신의 JavaScript를 호출 할 수도 있습니다. 네트워크 계층에 대한 전체 액세스 권한이 있습니다. 무엇이 더 필요합니까? HTTP 상태는 무엇이 필요합니까? 그것은 매우 낮은 수준의 물건입니다. 내가 원했고 필요한 것은 사용자가 자신의 정상적인 탐색 중에 가지고있는 것과 동일한 환경에서 사용자의 행동을 시뮬레이션 할 수 있어야한다는 것입니다. QtWebKit에서보기에 부족한 기능은 무엇입니까? –
특정 요소의로드를 확인하려면 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"
영업이 지연 AJAX 요청을 할 예정이었습니다뿐만 아니라 매우 짧은 시간 지연 문제를 해결하는 이유도 설명하는 또 다른 이유가있을 수 있다고 생각.
https://bugreports.qt-project.org/browse/QTBUG-37377
연결을 대기 사용하여 완벽한 loadingFinished() 신호가 연결되어 있어야이 문제를 해결하려면 다음과 같이 설명 된 동작을 일으키는 버그가 있습니다.
제가 올바르게 기억한다면, 제 경우에는 ** 페이지가로드 된 직후 Ajax 호출이 발생했기 때문에 ** 문제가있었습니다. 그러나 'loadFinished()'시그널이 출력되기 전에 어떤 것이 완료되었는지를 알지 못하기 때문에 Rob Knight가 제안한 것처럼 window.onload를 사용해야합니다. 어쨌든 QtWebKit의 개발이 QtWebEngine에 유리하게 되었기 때문에 나는 어떤 변화도 의지하지 않을 것입니다. –
동의합니다. 이 문제는 더 이상 해결되지 않습니다. 그러나이 해결 방법은 여전히 유용 할 수 있습니다. 나는 이것이 주어진 증상의 다른 가능한 이유라고 말하면서 나의 글을 편집했다. – Silicomancer
- 1. Zend_Rest_Client를 사용할 때 웹 서비스를 디버깅하는 방법
- 2. FILEGROWTH가 적용될 때 DB 크기를 아는 방법?
- 3. PHP에서 URL 리퍼러를 아는 방법?
- 4. JToolbar의 현황을 아는 방법?
- 5. 언어가 무엇인지 아는 방법?
- 6. 선택한 슬라이더를 아는 방법
- 7. textcompletion을 아는 방법, edittext
- 8. 코어 애니메이션이 끝난시기를 아는 방법?
- 9. Log4net - 파일이 롤백되는시기를 아는 방법?
- 10. PHP와 Javascript로 클라이언트 측 OS를 아는 방법?
- 11. 웹에서 사용할 글꼴을 아는 방법이 있습니까?
- 12. iPhone에서 서버 답장을 아는 방법?
- 13. HTTP 클라이언트를 처리 할 때 소켓을 닫는 방법을 아는 방법?
- 14. colorbox를 사용할 때 페이지를로드하는 방법
- 15. 프로세서 팬 속도를 아는 방법?
- 16. 힙의 끝 주소를 아는 방법?
- 17. jQuery 객체의 유형을 아는 방법?
- 18. UILabel에서 표시된 텍스트를 아는 방법?
- 19. NSData의 initWithContentsOfURL로드가 완료된시기를 아는 방법.
- 20. 어떤 신체가 충돌하는지 아는 방법?
- 21. uiimagepicker에서 이미지 피킹을 아는 방법?
- 22. 아이폰 applicaton 템플릿을 아는 방법?
- 23. 소켓이 블로킹 모드인지 여부를 아는 방법? 윈도우
- 24. 웹 서비스를 사용할 때 SocketException이 발생했습니다.
- 25. initWithContentsOfUrl을 사용할 때 콘텐츠 유형을 설정하는 방법
- 26. JDialog가 닫혀 있는지 여부를 아는 방법?
- 27. 셰어 포인트 필드 컨트롤을 아는 방법?
- 28. 보안 된 IIS7 웹 사이트에 연결할 때 사용할 인증서는 무엇입니까?
- 29. 갤러리 위젯이 스크롤을 멈출 때를 아는 방법?
- 30. WinDbg : WinDbg에서 발생한 휴식을 아는 방법?
어떻게 완전히로드를 정의합니까? 아약스 코드가 현재 실행되고 있지 않을 때 페이지가 완전히로드 되었습니까? (앞으로 아약스 코드가 실행될지라도?) 앞으로 아약스 코드가 실행되지 않을 때 페이지가 완전히로드됩니까? 이 정보를 가지고 다르게 무엇을 하시겠습니까? (왜 중요합니까?) – Bill
제 경우에는 ajax 호출이 onload 이벤트에서 호출되고 있습니다. 끝나면 완전히로드 된 페이지를 생각합니다. –