在哪些 Selenium 方法之后我应该添加随机睡眠?

问题描述 投票:0回答:1

我对制作机器人真的很陌生。
我正在为 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);
        }
    }
}

问题是现在我的机器人永远运行......

java selenium-webdriver sleep
1个回答
0
投票

通常不建议在 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()
之后添加随机睡眠的具体问题,我建议不要这样做。如上所述,通常最好使用显式等待。

如果您担心网站检测到您的机器人是机器人,您可以尝试使您的机器人的行为更加人性化。例如,您可以改变两次点击之间等待的时间,还可以为机器人的执行添加一些随机暂停。

但是,需要注意的是,没有万无一失的方法可以阻止网站检测到您的机器人是机器人。如果网站决心检测机器人,他们最终会找到一种方法来做到这一点。

最后,我建议您在生产网站上使用机器人之前对其进行彻底测试。这将帮助您在问题造成任何损害之前识别并解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.