0

我尝试将位置更改注入 JS/REACT-Application。注册于 的应用程序window.navigator.geolocation.watchPosition。我的想法是存根“watchPosition”方法以获取回调函数的句柄。然后直接从应用程序调用回调函数。

喜欢:

    const watchPositionFake = (successCallback, errorCallback, options) => {
        console.debug("PROXY set callback watchPosition");
        originalWatchPositionSuccessCallback = successCallback;
    };

    cy.visit("/", {
        onBeforeLoad(win) {
            cy.stub(win.navigator.geolocation, "watchPosition").callsFake(watchPositionFake);
        }
    });

这不适用于在watchPosition. 但这确实适用于 cypress-step 文件中的功能。(在 console.log 中工作,我看到位置根据我通过发送的值发生变化originalWatchPositionSuccessCallback )。

知道谁来伪造位置变化吗?

4

1 回答 1

0

有一种不同的方法可以解决navigator.geolocation.watchPosition触发注册函数的回调的问题。问题中的代码试图通过 来解决这个问题cy.stub(win.navigator.geolocation, "watchPosition"),但这变得不能可靠地工作(太快,太晚,不同的浏览器/窗口上下文,另一个 iframe,......),确切的原因各不相同。

在不修改生产代码的情况下触发已注册的 watchPosition 回调的另一种解决方案是 cypress 到 CDP 中未记录的 cypress (v6.2) 自动化接口。

export const setFakePosition = position => {
    // https://chromedevtools.github.io/devtools-protocol/tot/Emulation/#method-setGeolocationOverride
    console.debug(`cypress::setGeolocationOverride with position ${JSON.stringify(position)}`);
    cy.log("**setGeolocationOverride**").then(() =>
        Cypress.automation("remote:debugger:protocol", {
            command: "Emulation.setGeolocationOverride",
            params: {
                latitude: position.latitude,
                longitude: position.longitude,
                accuracy: 50
            }
        })
    );
};

并通过以下方式验证:

let positionLogSpy;
When("vehicle is located in {string}", city => {
    const position = cityLocationMap[city];
    cy.window()
        .then(win => {
            const expectedLogMessage = `new position lat: ${position.latitude}, lng: ${position.longitude}`;
            positionLogSpy = cy.spy(win.console, "log").withArgs(expectedLogMessage);
        })
        .then(() => {
            setFakePosition(position);
        });
});

Then("vehicle has moved to {string}", () => {
    expect(positionLogSpy).to.be.called;
});
于 2021-01-26T08:07:24.940 回答