我对制作机器人真的很陌生。
我正在为 this 网站开发 Selenium Java 机器人;它与 Reddit 类似,用户可以提出问题,其他用户可以回答问题。
我一直在手动收集我想要分析的问题列表(数千个),成功后我想单击其页面中的某些按钮。我将这些功能添加到我的机器人中,这样我就不必再这样做了,但我担心网站“认为”我有恶意。
我的机器人大量使用
WebElement#findElements
和 WebElement#click
,我主要想知道是否应该在每一个之后添加随机睡眠。public class Selenium
{
private static final WebDriver DRIVER = new ChromeDriver();
public static void execute(Consumer<WebDriver> action)
{
action.accept(DRIVER);
//sleep and rethrow any exceptions in order to stop the bot
try
{
TimeUnit.MILLISECONDS.sleep(1000 + ThreadLocalRandom().current().nextInt(3000));
}
catch(InterruptedException exception)
{
throw new RuntimeException(exception);
}
}
}
问题是现在我的机器人永远运行......
通常不建议在 Selenium 测试中使用 Thread.sleep(),因为它可能会导致不稳定的测试和性能问题。相反,最好使用显式等待,例如 WebDriverWait.until(),等待满足特定条件后再继续。
在您的情况下,您可以使用
WebDriverWait
等待元素可单击,然后再单击它。例如:
WebElement element = driver.findElement(By.cssSelector("#my-button"));
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.elementToBeClickable(element));
element.click();
这将等待最多 10 秒,让元素变得可点击,然后再单击它。如果该元素在 10 秒内未变得可点击,则测试将失败。
如果您不确定如何在特定情况下使用
WebDriverWait
,您可以查阅 Selenium 文档或在 Selenium 社区论坛上寻求帮助。
至于你是否应该在每个
WebElement#click()
之后添加随机睡眠的具体问题,我建议不要这样做。如上所述,通常最好使用显式等待。
如果您担心网站检测到您的机器人是机器人,您可以尝试使您的机器人的行为更加人性化。例如,您可以改变两次点击之间等待的时间,还可以为机器人的执行添加一些随机暂停。
但是,需要注意的是,没有万无一失的方法可以阻止网站检测到您的机器人是机器人。如果网站决心检测机器人,他们最终会找到一种方法来做到这一点。
最后,我建议您在生产网站上使用机器人之前对其进行彻底测试。这将帮助您在问题造成任何损害之前识别并解决问题。