From 5c5743ea11edd8a8dd3680b5c0f88819d9e72574 Mon Sep 17 00:00:00 2001 From: Corentin Barreau Date: Mon, 16 Sep 2019 02:40:44 +0200 Subject: [PATCH 1/4] Fix: closeSelector not being clicked Add: support for facebook.com/ads/library - Open and close metrics for ads --- brozzler/behaviors.yaml | 9 +++++++++ brozzler/js-templates/umbraBehavior.js.j2 | 22 +++++++++++++++------- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/brozzler/behaviors.yaml b/brozzler/behaviors.yaml index e792e69..7771ed0 100644 --- a/brozzler/behaviors.yaml +++ b/brozzler/behaviors.yaml @@ -17,6 +17,15 @@ # # first matched behavior is used, so order matters here +- + url_regex: '^https?://(?:www\.)?facebook\.com/ads/library/.*$' + behavior_js_template: umbraBehavior.js.j2 + request_idle_timeout_sec: 30 + default_parameters: + interval: 500 + actions: + - selector: 'a[data-testid="snapshot_footer_link"]' + closeSelector: 'div._7lq1 > button' - url_regex: '^https?://(?:www\.)?facebook\.com/.*$' behavior_js_template: facebook.js diff --git a/brozzler/js-templates/umbraBehavior.js.j2 b/brozzler/js-templates/umbraBehavior.js.j2 index dc4f083..5221c47 100644 --- a/brozzler/js-templates/umbraBehavior.js.j2 +++ b/brozzler/js-templates/umbraBehavior.js.j2 @@ -43,6 +43,7 @@ class UmbraBehavior { var documents = []; documents[0] = document; + var iframes = document.querySelectorAll("iframe"); var iframesLength = iframes.length; for (var i = 0; i < iframesLength; i++) { @@ -54,25 +55,27 @@ class UmbraBehavior { // console.log("exception looking at iframe" + iframes[i] + ": " + e); } } + var documentsLength = documents.length; for (var j = 0; j < documentsLength; j++) { if (closeSelector) { var closeTargets = documents[j].querySelectorAll(closeSelector); - if ((closeTargets.length > 0) && - (this.alreadyDone.indexOf(closeTargets[0]) === -1) && - (this.isVisible(closeTargets[0]))) { - doTarget(closeTargets[0], 'click'); + for (var i = 0; i < closeTargets.length; i++) { + this.doTarget(closeTargets[i], "click", "close"); } } + if (firstMatchOnly) { var doTargets = [ documents[j].querySelector(selector) ]; } else { var doTargets = documents[j].querySelectorAll(selector); } + var doTargetsLength = doTargets.length; if (!(doTargetsLength > 0)) { continue; } + for ( var i = 0; i < doTargetsLength; i++) { if (!repeatSameElement && this.alreadyDone.indexOf(doTargets[i]) > -1) { continue; @@ -82,7 +85,7 @@ class UmbraBehavior { } var where = this.aboveBelowOrOnScreen(doTargets[i]); if (where == 0) { - this.doTarget(doTargets[i], action); + this.doTarget(doTargets[i], action, 'open'); didSomething = true; break; } else if (where > 0) { @@ -133,7 +136,7 @@ class UmbraBehavior { return elem && !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length); } - doTarget(target, action) { + doTarget(target, action, type) { // console.log("doing " + action + target.outerHTML); // do mouse over event on target // since some urls are requsted only on @@ -147,7 +150,12 @@ class UmbraBehavior { target.click(); } // add new do's here! - this.alreadyDone.push(target); + // Only push the element to alreadyDone if it's + // an element we want to open. No need to track + // the close selectors + if (type == "open") { + this.alreadyDone.push(target); + } this.idleSince = null; } From fb30fb9aa3e4fad1c73a94dc2de140ab48287a1c Mon Sep 17 00:00:00 2001 From: Corentin Barreau Date: Wed, 25 Sep 2019 16:19:41 +0200 Subject: [PATCH 2/4] Add: isVisible check for close selectors Modify: doTarget - Revert to initial code --- brozzler/js-templates/umbraBehavior.js.j2 | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/brozzler/js-templates/umbraBehavior.js.j2 b/brozzler/js-templates/umbraBehavior.js.j2 index 5221c47..0911d97 100644 --- a/brozzler/js-templates/umbraBehavior.js.j2 +++ b/brozzler/js-templates/umbraBehavior.js.j2 @@ -61,7 +61,9 @@ class UmbraBehavior { if (closeSelector) { var closeTargets = documents[j].querySelectorAll(closeSelector); for (var i = 0; i < closeTargets.length; i++) { - this.doTarget(closeTargets[i], "click", "close"); + if (this.isVisible(closeTargets[i])) { + closeTargets[i].click(); + } } } @@ -85,7 +87,7 @@ class UmbraBehavior { } var where = this.aboveBelowOrOnScreen(doTargets[i]); if (where == 0) { - this.doTarget(doTargets[i], action, 'open'); + this.doTarget(doTargets[i], action); didSomething = true; break; } else if (where > 0) { @@ -136,7 +138,7 @@ class UmbraBehavior { return elem && !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length); } - doTarget(target, action, type) { + doTarget(target, action) { // console.log("doing " + action + target.outerHTML); // do mouse over event on target // since some urls are requsted only on @@ -153,9 +155,7 @@ class UmbraBehavior { // Only push the element to alreadyDone if it's // an element we want to open. No need to track // the close selectors - if (type == "open") { - this.alreadyDone.push(target); - } + this.alreadyDone.push(target); this.idleSince = null; } From 101f7f2e4a210c2896b3a42bd3da3e994fe4e226 Mon Sep 17 00:00:00 2001 From: Corentin Barreau Date: Wed, 25 Sep 2019 19:48:38 +0200 Subject: [PATCH 3/4] Remove: useless comment --- brozzler/js-templates/umbraBehavior.js.j2 | 3 --- 1 file changed, 3 deletions(-) diff --git a/brozzler/js-templates/umbraBehavior.js.j2 b/brozzler/js-templates/umbraBehavior.js.j2 index 0911d97..e4106ac 100644 --- a/brozzler/js-templates/umbraBehavior.js.j2 +++ b/brozzler/js-templates/umbraBehavior.js.j2 @@ -152,9 +152,6 @@ class UmbraBehavior { target.click(); } // add new do's here! - // Only push the element to alreadyDone if it's - // an element we want to open. No need to track - // the close selectors this.alreadyDone.push(target); this.idleSince = null; } From e701e3f101533fef9436a0767de49dd94e90a551 Mon Sep 17 00:00:00 2001 From: Corentin Barreau Date: Thu, 26 Sep 2019 21:44:25 +0200 Subject: [PATCH 4/4] Add: break after closing the first visible element --- brozzler/js-templates/umbraBehavior.js.j2 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/brozzler/js-templates/umbraBehavior.js.j2 b/brozzler/js-templates/umbraBehavior.js.j2 index e4106ac..7931a62 100644 --- a/brozzler/js-templates/umbraBehavior.js.j2 +++ b/brozzler/js-templates/umbraBehavior.js.j2 @@ -63,6 +63,8 @@ class UmbraBehavior { for (var i = 0; i < closeTargets.length; i++) { if (this.isVisible(closeTargets[i])) { closeTargets[i].click(); + didSomething = true; + break; } } }