wait for elements
This commit is contained in:
@ -24,26 +24,30 @@
|
||||
);
|
||||
|
||||
function extract(itemsSelector, fieldSelectors) {
|
||||
// let fieldNotFound = false;
|
||||
// since some elements may be loaded asynchronously.
|
||||
// if one field is never found, we should return undefined,
|
||||
// so that senders can detect to retry until elements loaded.
|
||||
// If user writes wrong selectors, the task retries infinitely.
|
||||
let fieldFound = {};
|
||||
let items = Array.from(document.querySelectorAll(itemsSelector));
|
||||
if (!items.length) return [];
|
||||
// items may not loaded yet, tell the sender to retry.
|
||||
if (!items.length) return MSG_ELEMENT_NOT_FOUND;
|
||||
let results = items.map(
|
||||
item => {
|
||||
return fieldSelectors.map(
|
||||
selector => {
|
||||
let [cls, attr] = selector.split('@').slice(0, 2);
|
||||
// TODO: close tab to cancel task tip
|
||||
// if (fieldNotFound) return;
|
||||
let fieldVals = Array.from(item.querySelectorAll(cls));
|
||||
// if (!fieldVals.length) {
|
||||
// fieldNotFound = true;
|
||||
// return;
|
||||
// }
|
||||
if (!fieldVals.length) {
|
||||
return;
|
||||
}
|
||||
fieldFound[selector] = true;
|
||||
return fieldVals.map(find => attr ? find[attr] : find.textContent.trim()).join('\n')
|
||||
}
|
||||
)
|
||||
}
|
||||
);
|
||||
// return fieldNotFound ? [] : results
|
||||
return results;
|
||||
// if it exists a field, which is not found in any row, the sender should retry.
|
||||
let shouldWait = fieldSelectors.reduce((p, c) => p || !fieldFound[c], false);
|
||||
return shouldWait ? MSG_ELEMENT_NOT_FOUND : results
|
||||
}
|
||||
Reference in New Issue
Block a user