我想编写一个程序来针对不同的屏幕尺寸自动测试Web尺寸。我使用QWebEngineView创建窗口,并且需要模拟用户鼠标来单击并拖动网页中的拖放元素。我已经尝试了qApp-> sendEvent和qApp-> postEvent,但是没想到工作。

QMouseEvent *event1 = new QMouseEvent (QEvent::MouseButtonPress, point,
Qt::LeftButton,
Qt::LeftButton,
Qt::NoModifier);

qDebug() << qApp->sendEvent (driver, static_cast <QEvent *> ( event1 ) );

QMouseEvent *event2 = new QMouseEvent (QEvent::MouseButtonRelease, point,
Qt::LeftButton,
Qt::LeftButton,
Qt::NoModifier);

qDebug() << qApp->sendEvent (driver, static_cast <QEvent *> ( event2 ));


这两个类均返回true,但不会触发网页中的事件。我需要首先关注观点吗?它没有父母,是一个窗口。不再使用图形元素。
你能帮助我吗?

PS:我不想使用javascript,因为:我无法使用javascript模拟点击来集中输入,它没有坐标来测试画布的拖放。

最佳答案

看来您必须访问QWebEngineView的子对象,然后向其发送事件。以下是鼠标左键的实现。您可以更改位置clickPos进行释放,然后按模拟拖动。

void LeftMouseClick(QWidget* eventsReciverWidget, QPoint clickPos)
{
    QMouseEvent *press = new QMouseEvent(QEvent::MouseButtonPress,
                                            clickPos,
                                            Qt::LeftButton,
                                            Qt::MouseButton::NoButton,
                                            Qt::NoModifier);
    QCoreApplication::postEvent(eventsReciverWidget, press);
    // Some delay
    QTimer::singleShot(300, [clickPos, eventsReciverWidget]() {
        QMouseEvent *release = new QMouseEvent(QEvent::MouseButtonRelease,
                                                clickPos,
                                                Qt::LeftButton,
                                                Qt::MouseButton::NoButton,
                                                Qt::NoModifier);
        QCoreApplication::postEvent(eventsReciverWidget, release);
    }));
}
QWebEngineView webView = new QWebEngineView();
// You need to find the first child widget of QWebEngineView. It can accept user input events.
QWidget* eventsReciverWidget = nullptr;
foreach(QObject* obj, webView->children())
{
    QWidget* wgt = qobject_cast<QWidget*>(obj);
    if (wgt)
    {
        eventsReciverWidget = wgt;
        break;
    }
}
QPoint clickPos(100, 100);
LeftMouseClick(eventsReciverWidget, clickPos);


从以下答案中借用Qt WebEngine simulate Mouse Event How to send artificial QKeyEvent to QWebEngineView?

10-05 19:00