关于Java中Selenium并行测试性能的问题

关于Java中Selenium并行测试性能的问题,java,selenium,selenium-webdriver,web-scraping,selenium-grid,Java,Selenium,Selenium Webdriver,Web Scraping,Selenium Grid,我在做一个网页抓取项目,我们面临旧的java脚本渲染问题。 目前,我们使用SeleniumWebDriver执行对需要呈现JS的站点的请求。 有了Jsoup(不能在网站上执行java脚本),一切都能以超高速运行,但当涉及到Selenium请求时,我认为我只是做错了。。下面是我的问题: 1.)如果我在java脚本执行后只需要响应html字符串(不点击元素等),那么首先selenium是不是有点过头了?我也试过了,但不知怎么的,它没有像硒一样正常工作。有时执行JS脚本,有时不执行。是否有更快/更合适

我在做一个网页抓取项目,我们面临旧的java脚本渲染问题。 目前,我们使用SeleniumWebDriver执行对需要呈现JS的站点的请求。 有了Jsoup(不能在网站上执行java脚本),一切都能以超高速运行,但当涉及到Selenium请求时,我认为我只是做错了。。下面是我的问题:

1.)如果我在java脚本执行后只需要响应html字符串(不点击元素等),那么首先selenium是不是有点过头了?我也试过了,但不知怎么的,它没有像硒一样正常工作。有时执行JS脚本,有时不执行。是否有更快/更合适但仍然可靠的产品?(PhantomJS似乎不受欢迎)

2)我做错了吗? 简而言之,我目前运行并行“测试”的方式:

  • 创建一个包含20个线程的线程池
  • 在此线程池上排队5000个网站链接(一次并行刮取20个不同的网站)
  • 在每个线程中:输入一个包含该网站x个链接的循环
  • 对于每个X链接->创建一个新的ChromeDriver实例,获取响应,关闭实例。->重复(20个循环打开和关闭Chrome实例)
  • 我想,对于每个线程,我可以只打开一个驱动程序实例并重用它以节省一些处理时间,但它也更容易出错。如果驱动程序实例崩溃了怎么办?当前我正在为实例设置一个硬超时以获取响应,然后我强制退出它。 最重要的是程序不会停止刮取。它决不能因为空闲/崩溃的Chrome实例而崩溃。在使用该方法进行了数千次请求之后,我实际上执行了这个块

    public void killAllChromeProcesses(){
            try {
                Thread.sleep(1000);
                log.info("Killing all chrome processes..");
                Process proc = Runtime.getRuntime().exec("killall chrome");
                proc.waitFor();
                log.info("..all chrome processes killed successfully!");
            } catch (IOException | InterruptedException e) {
                e.printStackTrace();
            }
        }
    
    因为我意识到,即使在执行selenium时(硬超时30秒)

    。。经过数小时的清理,当我查看我的系统进程时,仍然有未关闭/失效的chrome进程。(我猜在实例化Chrome本身时也会发生错误,因为我使用的是spring boot,所以这些错误会转化为运行时异常,但我还无法识别这些异常……不过这只是一个猜测。)

    我读过一篇关于“Selenium Grid”的文章,目前正在考虑切换到使用这种架构。但基本上,这不是一件事+大量的技术堆栈/开销吗? 我需要一些一般性的建议和意见

    谢谢你做的一切! 致以最良好的祝愿

    driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
    try {
                driver.get(link);
            } catch (Exception e){
                log.error("Selenium error for {} .",link);
            }finally{
                if (driver != null) {
                    driver.close();
                    driver.quit();
                }
            }