JavasScript等待Web元素可见并单击它

时间:2019-05-26 12:27:08

标签: javascript google-chrome browser automation

我正在尝试使用JavaScript自动执行某些任务。网站正在生成中,所以我不能使用CSS选择器,因为每次网站刷新时它们都会改变。它未在示例中显示,但可以通过按钮的文本内容来操作按钮(不幸的是,CSS无法获得按钮内容)。

我已经弄清楚了(由于StackOverflow)如何通过Xpath单击Web元素,但是仍然不知道如何告诉JS等待它出现。

点击元素的代码(有效):

var xPathRes = document.evaluate ('//*[@id="tsf"]/div[2]/div/div[3]/center/input[1]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);
xPathRes.singleNodeValue.click();

尝试等待元素出现,然后单击它(不起作用):

var selector = "//*[@id='tsf']/div[2]/div/div[3]/center/input[1]";
var time = 500;
    if(document.evaluate (selector, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null)) {
        selector.singleNodeValue.click();
        return;
        }
    else {
        setTimeout(function() {
        waitForElementToDisplay(selector, time);
        }, time);    
    }

您可以在示例中看到的代码是Google.com搜索按钮。

我一直使用Python Selenium来做这些事情,但是在这种情况下我确实不能。

PS。从已发布的代码可以明显看出,我很喜欢JS。

谢谢您的帮助!

编辑:

在@folo代码之后,我写了这样的东西:

var element = '//*[@id="tsf"]/div[2]/div/div[3]/center/input[1]';
(function checkIfElemExists() {
   if (!document.evaluate (element, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null)) {
     console.log('nope')
     window.requestAnimationFrame(checkIfElemExists);
   } else {
     console.log('okay i exist now! lets do something.') 
   }
 })()

问题是它总是返回“好吧,我现在已经存在!)。即使我在不​​包含此元素的网站上运行它,也是如此。

3 个答案:

答案 0 :(得分:1)

如果我对您的理解正确,那么您想确定DOM中何时开始存在某个元素?

如果是这样,您应该使用requestAnimationFrame

 (function checkIfElemExists() {
   if (!document.querySelector('.some-element')) {
     window.requestAnimationFrame(checkIfElemExists);
   } else {
     console.log('okay i exist now! lets do something.')
   }
 })()

每当浏览器中请求一个新框架时,它将检查元素是否存在,如果存在,它将停止并执行您想做的任何事情。有效而干净。

编辑:

我不确定我是否理解为什么如果可以使用xpath就不能使用css选择器,如果要使用css选择器,那将是一个:

#tsf>div:nth-of-type(2)>div>div:nth-of-type(3)>center>input:nth-of-type(1)

用它替换“ .some-element”选择器。

答案 1 :(得分:0)

仅当页面(DOM)完全加载时,该按钮才会出现。在javascript中,您可以使用“ onload”事件:

window.onload = function () { 
   //Code to execute when page is loaded.
}

或通过JQuery:

$( document ).ready(function() {
    //Code to execute when page is loaded.
});

我希望这是您想要的。

答案 2 :(得分:0)

最后,我设法找到一种方法来告诉Javascript等待网站上的Xpath元素:

var element = '//*[@id="tsf"]/div[2]/div/div[3]/center/input[1]'; 
var clickButton = document.evaluate (element, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; 
(function checkIfElemExists() { 
   if (clickButton == null) { 
     console.log('nope') 
     window.requestAnimationFrame(checkIfElemExists); 
   } else { 
     console.log('okay i exist now! lets do something.') 
     clickButton.click() 
   } 
})() 

感谢@folo的帮助!非常感谢!