使代码等待弹出窗口打开,然后抓取弹出窗口

时间:2019-01-08 15:33:43

标签: javascript

我正在编写一个可以自动执行一些浏览器操作的JS脚本。

使用get_baskets_onclicks,我从某些DOM元素中收集onclick函数,并将它们以数组形式返回。每个onclick看起来像这样:

onclick="PrimeFaces.ab({s:"j_id_32:GenerationTable:0:j_id_1e_2_3p",u:"@widgetVar(GenerationCodingDialog)",onco:function(xhr,status,args){PF('GenerationCodingDialog').show();}});return false;"

并打开一个弹出窗口,我需要使用get_MAP_data从中收集一些数据。

此外,每个函数都在get_MAP_data内部调用。

问题是我无法让代码等待打开弹出窗口,因此get_MAP_data返回的数据为空。

除了下面的document.readyState === 'complete'外,我还尝试了window.onload = function(){},但无济于事。

是否可以让浏览器(Chrome)等待?我想我不能使用jQuery,因为这不是我的网页。

function get_baskets_onclicks() {
    // returns array of functions that launch MAP dialogs
    var baskets = Array.from(document.getElementsByClassName("ui-commandlink ui-widget margin-right-5px"));
    var baskets_onclicks = baskets.map(basket => basket.onclick);
    return baskets_onclicks;
};

function get_MAP_data(basket_onclick) {
    basket_onclick()
    if (document.readyState === 'complete') {
        console.log("PAGE LOADED");
        // wait here for the dialog to open
        // dt = detail table
        var MAP_data = {} // container for transaction details
        var labels_to_get = ['Description', 'Category', 'Department', 'Justification', 'My Shop Voucher', 'My Shop Coding'];
        var all_dts = document.getElementsByClassName('summary-details-grid');
        var dt = Array.from(all_dts).filter(table => table.parentElement.id == "paymentGenerationmyShopCodingForm")[0];
        var dt_body = dt.children[0];
        var dt_trs = Array.from(dt_body.children)   ;
        dt_trs.forEach(function(tr) {
            tds = Array.from(tr.children);
            tds.forEach(function(td) {
                var label = td.textContent;
                if (labels_to_get.includes(label)) {
                    var value_for_label = tds[1].textContent;
                    MAP_data[label] = value_for_label;
                    console.log(label, value_for_label);
                };
            });
        });
        // console.log(MAP_data);
        return MAP_data;
    };
};

var first_onclick = get_baskets_onclicks()[0];
get_MAP_data(first_onclick);

2 个答案:

答案 0 :(得分:0)

https://developer.mozilla.org/en-US/docs/Talk:DOM/window.setTimeout

http://mdn.beonex.com/en/DOM/window.setInterval.html

重试,setTimeout,setInterval和while循环的组合,我不确定特定模式的最佳方法,但是其中一个选项应该适合轮询DOM结果,直到有东西出现或尝试了很多次为止。

答案 1 :(得分:0)

一个小的修补程序是使您的代码轮询所检查元素的存在。

let interval = setInterval(() => {
  var all_dts = document.getElementsByClassName('summary-details-grid');
  if (all_dts.length !== 0) {
    // Found some elements, now lets run the code
    clearInterval(interval);
    get_MAP_data(first_onclick);
  }
}, 100);

这将每十秒检查一次summary-details-grid类,并在找到它们时运行代码。