tag element out of the page as non-interactable (#273)

This commit is contained in:
LawyZheng
2024-05-08 10:25:32 +08:00
committed by GitHub
parent 8d87e71891
commit 01f834bbbd

View File

@@ -232,7 +232,18 @@ function isElementVisible(element) {
} }
if (!isElementStyleVisibilityVisible(element, style)) return false; if (!isElementStyleVisibilityVisible(element, style)) return false;
const rect = element.getBoundingClientRect(); const rect = element.getBoundingClientRect();
return rect.width > 0 && rect.height > 0; if (rect.width <= 0 || rect.height <= 0) {
return false;
}
// if the center point of the element is not in the page, we tag it as an interactable element
const center_x = (rect.left + rect.width) / 2;
const center_y = (rect.top + rect.height) / 2;
if (center_x < 0 || center_y < 0) {
return false;
}
return true;
} }
function isHiddenOrDisabled(element) { function isHiddenOrDisabled(element) {
@@ -894,14 +905,19 @@ function buildTreeFromBody() {
}); });
}; };
// some elements without children should be removed out, such as <label> // some elements without children nodes should be removed out, such as <label>
const removeOrphanNode = (results) => { const removeOrphanNode = (results) => {
const trimmedResults = []; const trimmedResults = [];
for (let i = 0; i < results.length; i++) { for (let i = 0; i < results.length; i++) {
const element = results[i]; const element = results[i];
element.children = removeOrphanNode(element.children); element.children = removeOrphanNode(element.children);
if (element.tagName === "label" && element.children.length === 0) { if (element.tagName === "label") {
continue; const labelElement = document.querySelector(
element.tagName + '[unique_id="' + element.id + '"]',
);
if (labelElement && labelElement.childElementCount === 0) {
continue;
}
} }
trimmedResults.push(element); trimmedResults.push(element);
} }