我试图做以下练习。我想从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>
我也尝试过这样的功能
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();
}
}
结果是当它以递归方式访问函数时它进入无限循环,他在点击后看不到更少的启用元素。
我使用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'
这种错误是由于浏览器无法正确导航到元素时引起的。请参阅我的回复,了解我是如何解决的
答案 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);
}
}
}
}
}
}