2017-11-20 12 views
0

Qt WebDriverでQmlアプリケーションをテストします。現在のビューでは、Qt WebDriverとSeleniumでQmlアプリケーションのこのコマンドをサポートしていません。

私はQt 5.2.1バージョンとQtドライバをインストールしました。
Use QtWebDriver to run your applicationに従って、QtWebDriverとアプリケーションを統合した後。

main.ccは、次のようになります。

{ ~ } » curl localhost:9517/status                         ~ 
{"status":0,"value":{"build":{"revision":"WebDriver-cisco-cmt-1.3.0-87-g965f9466de-dirty","time":"Nov 15 2017 17:02:18 PST","version":"1.3.3"},"os":{"arch":"x86","name":"Windows NT","version":"6.2"}}} 

アクセスするためのアプリケーションが私はQtのドライバの状態を確認することができます実行されている場合

enter image description here

#define WD_ENABLE_WEB_VIEW 0 
#define QT_NO_SAMPLES 1 

#include "mainwindow.h" 
#include <QApplication> 
#include "Headers.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow w; 
    wd_setup(argc, argv); 
    w.show(); 

    return a.exec(); 
} 

アプリケーションは次のようになります私が行ったQml要素この記事:QML Specifics

Rectangle { 
     id: buttonDirect 
     objectName: "vradio_direct_button" 

     property string text: "Direct" 
     ... 
     Text { 
      id: buttonDirectLabel; text: buttonDirect.text; anchors.centerIn: buttonDirect; color: activePalette.buttonText; font.pixelSize: 24 
      objectName: "vradio_direct_button" 
     } 
    } 

ドライバの設定は以下の通りです:

@Override 
    public RemoteWebDriver getDriver() { 
     RemoteWebDriver remoteWebDriver = null; 

     DesiredCapabilities cap = new DesiredCapabilities(); 
     cap.setCapability("maximize", true); 
     //specify reuseUI to have WebDriver terminate any previous session and reuse its windows 
     cap.setCapability("reuseUI", true); 

     //specify to select the first found window 
     cap.setCapability("browserStartWindow", "*"); 

     LoggingPreferences logs = new LoggingPreferences(); 
     Level level = Level.ALL; 
     logs.enable(LogType.DRIVER, level); 
     logs.enable(LogType.BROWSER, level); 
     logs.enable(LogType.PERFORMANCE, level); 
     // specify log level 
     cap.setCapability(CapabilityType.LOGGING_PREFS, logs); 

     try { 
      URL url = new URL("http://localhost:9517"); 
      remoteWebDriver = new RemoteWebDriver(url, cap); 

      Logger.debug("Native Page Sources:\n" + remoteWebDriver.getPageSource()); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } 
     return remoteWebDriver; 
    } 
    } 

しかし、私が実行したいとき:

Object object = Driver.getDefault().executeScript("var v = ObjectNameUtils.findChild('vradio_direct_button'); return v.text;"); 
    Logger.info("Here is JS output:" + object); 

私が得た:

org.openqa.selenium.WebDriverException: Script execution failed. Script: var v = ObjectNameUtils.findChild('vradio_direct_button'); return v.text;; 
Current view doesnt support this command. (WARNING: The server did not provide any stacktrace information) 
Command duration or timeout: 0 milliseconds 
Build info: version: '3.7.0', revision: '2321c73', time: '2017-11-02T22:22:35.584Z' 
System info: host: 'LVL1305001', ip: '172.22.73.100', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_151' 
Driver info: org.openqa.selenium.remote.RemoteWebDriver 
Capabilities {acceptSslCerts: false, applicationCacheEnabled: true, browserConnectionEnabled: true, browserName: QtWebkit, cssSelectorsEnabled: true, databaseEnabled: false, handlesAlerts: true, hybrid: {qml2: true, qtVersion: 5.2.1, widget: true}, javascriptEnabled: true, locationContextEnabled: false, nativeEvents: true, platform: XP, platformName: XP, remotePlayerEnabled: true, reuseUI: true, rotatable: false, takesElementScreenshot: true, takesScreenshot: true, webStorageEnabled: true} 
Session ID: bfa073ee2e334f4977281996f3240b90 

ネイティブページソース:

<?xml version="1.0" encoding="UTF-8"?> 
<MainWindow elementId="2312dc5007f290f9bf4f3f92d3aa6884" className="MainWindow"> 
    <QRubberBand id="qt_rubberband" elementId="45050a91d64ad4cde3e3df8091813f54" className="QRubberBand"/> 
    <QDeclarativeView elementId="3c4890eed00091c95bde9a653f59d22e" className="QDeclarativeView"> 
     <QWidget id="qt_scrollarea_hcontainer" elementId="ff075abbbeb5fe23501c7da3241def96" className="QWidget"> 
      <QScrollBar elementId="51188e66ef541bc0563bea5780cf8ed2" className="QScrollBar"/> 
     </QWidget> 
     <QWidget id="qt_scrollarea_vcontainer" elementId="3692bfb1340019907b7982f1ef2f821f" className="QWidget"> 
      <QScrollBar elementId="e76434466faf78d008ca5b096719e188" className="QScrollBar"/> 
     </QWidget> 
     <QWidget elementId="ac4c1e620945ad4784fbbcd3c60ae3f1" className="QWidget"/> 
    </QDeclarativeView> 
</MainWindow> 

UPDATE:私は前にこの記事を読んで、このポストを作った

。しかし、私は完全な考えを得ていませんでした。

私は私のQDeclarativeViewに直接接続する必要があり、このため、私はQtDriverための機能でそれを指定する必要があることを理解:

cap.setCapability(「browserClass」、「MyWebView」);

はまた、私はサーバー側でそれを設定する必要があります。

int main(int argc, char *argv[]) 
{ 
    //Configure web support 
    webdriver::ViewCreator* webCreator = new webdriver::QWebViewCreator(); 
    //Register custom web view subclass 
    webCreator->RegisterViewClass<QDeclarativeView>("MyWebView"); 

は、私は右ですか?何かが機能しなくなってしまっていますか?

このエラーを解決してボタンをクリックするにはどうすればよいですか?

答えて

1
cap.setCapability("browserStartWindow", "*"); 

QtWebdriverは、最初に見つかったウィンドウを選択いたします。

ネイティブソースから見たように、MainWindowはJSをサポートしないQWidgetであり、したがってエラーメッセージです。

明示的にQDeclarativeviewを選択する必要があります。

このリンク:https://github.com/cisco-open-source/qtwebdriver/wiki/Hybridity-And-View-Management はより多くのそれを行う方法の詳細だけでなく、コードサンプル

+0

更新質問を提供します。 –

関連する問題