JavaScript - 点击代码

时间:2017-06-18 16:00:54

标签: javascript google-chrome loops button click

我试图做以下练习。我想从Chrome开发者控制台循环遍历属于一个类的所有按钮,然后单击每个按钮。 它是页面上类似于机器人的脚本,我不知道它的来源。可能这是一个糟糕的问题......请不要踢我太多。

代码如下,但仅在第一个元素上执行click:

Clicker();

function Clicker ()
{
    var buttons = document.getElementsByClassName('myclass');
    for (var i = 0; i <= buttons.length; i++) {
        if(buttons[i])
        {
            if(buttons[i].firstChild.nodeValue)
            {
                if(!buttons[i].disabled)
                {
                    buttons[i].click();
                }   
            }
        }   
    }

    return 'execution complete';
}

按钮按以下方式编写:

<button class="myclass" data-action="perfom_job.perform_job">
        Perform Some Job
</button>
<button class="myclass" data-action="perfom_job.perform_job">
        Perform Some Job
</button>
<button class="myclass" data-action="perfom_job.perform_job">
        Perform Some Job
</button>
<button class="myclass" data-action="perfom_job.perform_job">
        Perform Some Job
</button>

如果我将按钮[i]插入console.log(),则在元素检查器中查看右按钮。 可能是哪个问题?

点击的按钮变为

<button class="myclass" disabled="">
   Perform Some Job
</button>

更新1

我也尝试过这样的功能

Clicker();

function Clicker ()
{
    var buttons = document.getElementsByClassName('myclass');
    var enabled_buttons = [];

    for (var i = 0; i < buttons.length; i++) {
        if(buttons[i])
        {
            if(buttons[i].firstChild.nodeValue)
            {
                if(!buttons[i].disabled)
                {
                    enabled_buttons.push(buttons[i]);
                }   
            }
        }
    }
    console.log(enabled_buttons.length);
    if(enabled_buttons.length > 0)
    {
        enabled_buttons[0].click();
        Clicker();
    }
}

结果是当它以递归方式访问函数时它进入无限循环,他在点击后看不到更少的启用元素。

更新2

我使用Selenium和我的Visual Studio社区2017进行了一些设置,并尝试使用Microsoft Edge自动化做同样的事情,以便更清楚地获得错误!

using (IWebDriver driver = new EdgeDriver())
{
    driver.Url = txtUrl.Text;

    IReadOnlyCollection<IWebElement> query = driver.FindElements(By.ClassName("myclass"));

    foreach(IWebElement elem in query)
    {
        elem.Click();        
    }  
}

循环中的第一个元素是可以的,对于我得到的第二个元素:

System.InvalidOperationException: 'Element is obscured'

更新3

这种错误是由于浏览器无法正确导航到元素时引起的。请参阅我的回复,了解我是如何解决的

2 个答案:

答案 0 :(得分:0)

function Clicker() {
    var buttons = $('button.myclass');
    $.each(buttons, function () {
        if (!$(this).is(":disabled")) {
            $(this).click();
        }
    });

    return 'execution complete';
}         

可能对你有所帮助

答案 1 :(得分:0)

最后,我不得不离开Idea,使用带有javascript粘贴代码的chrome控制台来完成这类工作。我选择了Visual Studio Community 2017 C#+ Selenium WebDriver + ChromeDriver

以下是工作代码:

using System;
using System.Linq;
using System.Collections.Generic;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Interactions;

namespace DefaultNameSpace
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            ChromeOptions options = new ChromeOptions();
            //I have used my Chrome's default profile. The path is for MacOSX
            options.AddArguments("user-data-dir=/Users/<user name>/Library/Application Support/Google/Chrome/Default");
            options.AddArguments("disable-infobars");

            string s;
            Console.WriteLine("Enter Command:");
            while (true)
            {
                s = Console.ReadLine();
                if (s.ToLower() == "exit")
                {
                    Environment.Exit(0);
                }
                else
                {
                    using (IWebDriver driver = new ChromeDriver(options))
                    {
                        driver.Url = s;
                        Clicker(driver);
                    }
                    Console.WriteLine("Execution complete");
                }
            }

        }

        private static void Clicker(IWebDriver driver)
        {
            IReadOnlyCollection<IWebElement> query = driver.FindElements(By.CssSelector(myclass));

            foreach (IWebElement elem in query)
            {
                if (elem.Enabled && elem.Text.Trim() == "Button text")
                {
                    try
                    {
                      //go to the page top
                      IJavaScriptExecutor jse = (IJavaScriptExecutor)driver;
                      jse.ExecuteScript("window.scrollBy(0,0)", "");

                      //go to button and make click
                      Actions actions = new Actions(driver);
                      actions.MoveToElement(elem).Click().Perform();

                      Clicker(driver);
                   }
                   catch (Exception ex)
                   {
                      string log = ex.ToString();
                   }
                   finally
                   {
                        //Clicker(driver);   
                   }
               }
           }
        }
    }
}