开发者问题收集

当您必须等待第二个按钮出现时,如何重复单击两个按钮?

2021-03-20
313

我正在编写一个简单的脚本,该脚本循环遍历页面上的所有元素,并使用原生 JavaScript 共享它们。以下是我目前所拥有的

var buttons = document.getElementsByClassName('share-gray-large');
for(var i=0; i<buttons.length; i++){
    buttons[i].click();
    document.getElementsByClassName('internal-share__link')[0].click();
}

share-gray-large 按钮是“共享”按钮的类。单击第一个共享按钮后,会出现一个模式,询问用户他们想要将项目共享到哪里。我需要单击模式中类名为 internal-share__link 的第一个项目。我遇到的问题是,我代码的最后一行导致以下错误

Uncaught TypeError: Cannot read property 'click' of undefined

这是有道理的,因为在调用第二个 click() 函数时模式尚未出现。我需要等待元素出现,然后单击它,然后等到模式消失才能共享下一个项目。我研究了 async/await 函数、 setTimeout() 以及类似 StackOverflow 问题的解决方案。我采用了这个辅助解决方案

var waitForEl = function(className, callback) {
    if (document.getElementsByClassName(className).length) {
        callback();
    } else {
        setTimeout(function() {
            waitForEl(className, callback);
        }, 100);
    }
};

var buttons = document.getElementsByClassName('share-gray-large');
for(var i=0; i< buttons.length; i++){
    waitForEl('share-gray-large', function() {
        document.getElementsByClassName('share-gray-large')[i].click();
    });
    waitForEl('internal-share__link', function() {
        document.getElementsByClassName('internal-share__link')[0].click();
    });
}

,它 有点 有效,但我相信它实际上最终会多次共享最后一项,而不是按顺序共享所有项。我在另一个项目中也遇到了需要等待按钮出现的问题,因此任何帮助都将不胜感激!

TL;DR 我正在按照以下步骤顺序进行项目。使用包含 3 个需要共享的项目的页面:

  1. 单击第一个按钮上的“共享”
  2. 等待确认按钮出现在模式中
  3. 单击确认
  4. 等待模式消失
  5. 单击第二个按钮上的“共享”
  6. 重复步骤 2-4
  7. 单击第三个按钮上的“共享”
  8. 重复步骤 2-4

如何在 VanillaJS 中执行此操作?

2个回答

这将点击从最后一个到第一个共享按钮,排除电子邮件共享,并确保浏览器被允许点击/打开多个弹出窗口。

function waitForElement(selector) {
    var element = document.querySelectorAll(selector);
    if (element.length) {
        if (shareLinkCount == 999) { // set to real number of elements
            shareLinkCount = element.length;
        }
        shareLinkCount--;
        var shareElement = element[shareLinkCount];
        if(shareElement.textContent != "Email") // Do not click email share 
            element[shareLinkCount].click();

        if (shareLinkCount) { // not 0
            setTimeout(clickShareButton, 500);
        }
        else{
            alert('Click Finished');
            document.body.click();
        }
    } else {
        setTimeout(waitForElement, 500, selector);
    }
}

function clickShareButton() {
    var button = document.querySelector('.share-gray-large');
    button.click();
    waitForElement('internal-share__link');
}

var shareLinkCount = 999; // dummy number

clickShareButton();
uingtea
2021-03-20

这是对我有用的答案。大部分解决方案都归功于 @uingtea 。由于我没有发布网站链接,因此我能够测试它并修改他们的解决方案以满足我的需求。

function waitForElement(selector) {
    var element = document.querySelector(selector);
    if (element) {
        shareLinkCount--;
        element.click();

        if (shareLinkCount) { // not 0
            setTimeout(clickShareButton, 500);
        }
        else{
            element.click();
            alert('Click Finished');
        }
    } else {
        setTimeout(waitForElement, 500, selector);
    }
}

function clickShareButton() {
    document.querySelectorAll('.share-gray-large')[shareLinkCount].click();
    waitForElement('.internal-share__link');
}

var shareLinkCount = document.querySelectorAll('.share-gray-large').length - 1;


clickShareButton();
Paulina Khew
2021-03-22