Added frame.waitFor(selector) (#59)

This patch adds `frame.waitFor(selector)` method.

Fixes #42.
This commit is contained in:
Aleksey
2017-07-07 15:39:02 -07:00
committed by Andrey Lushnikov
parent a0eeb415f2
commit 090ecfa6b9
4 changed files with 104 additions and 0 deletions

View File

@@ -197,6 +197,39 @@ class FrameManager extends EventEmitter {
});
return response.result.value;
}
/**
* @param {string} selector
* @param {!Frame} frame
* @return {!Promise<undefined>}
*/
async _waitForInFrame(selector, frame) {
let code = selector => new Promise((fulfill, reject) => {
if (document.querySelector(selector)) {
fulfill();
return;
}
new MutationObserver((mutations, observer) => {
for (let mutation of mutations) {
for (let node of mutation.addedNodes) {
if (node.matches(selector)) {
observer.disconnect();
fulfill();
return;
}
}
}
}).observe(document.documentElement, {
childList: true,
subtree: true
});
});
await this._client.send('Runtime.evaluate', {
expression: helper.evaluationString(code, selector),
awaitPromise: true,
returnByValue: true,
});
}
}
/** @enum {string} */
@@ -287,6 +320,14 @@ class Frame {
return this._detached;
}
/**
* @param {string} selector
* @return {!Promise<undefined>}
*/
async waitFor(selector) {
await this._frameManager._waitForInFrame(selector, this);
}
/**
* @param {?Object} framePayload
*/