在Azure Batch上运行Selenium并行测试

22

我正在使用 Windows 7 上最新版本的 R。

我想使用 RSelenium 并行运行多个测试,所以我的问题是:

  • 运行多个 RSelenium 测试的推荐方法是什么?

假设我想运行 1000 个测试,每个步骤需要 1 小时。逐个运行测试需要很长时间(每天只能运行 24 个测试,总计约 42 天)。我知道如何使用 doParallel 和 foreach 包在我的机器上并行运行测试:Run RSelenium in parallel,但有时这还不够。我想同时运行大约 100 个测试。我尝试使用 Azure Batch 进行操作,但在启动 selenium 服务器时,在某些节点上出现了许多错误。

更具体地说,我已经编写了 dockerfile:

FROM rocker/r-base:latest 

RUN  apt-get update \
  && apt-get install -y --no-install-recommends \
   libxml2-dev \
   libcurl4-openssl-dev \
   libssl-dev \
   gnupg2 \
   libfftw3-dev \
   libtiff-dev \
   libx11-dev \
   libcairo2-dev \
   libxt-dev \
   firefox

#RUN add-apt-repository -y ppa:mozillateam/firefox-next

## Install Java 
RUN echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" \ 
        | tee /etc/apt/sources.list.d/webupd8team-java.list \ 
    && echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" \ 
        | tee -a /etc/apt/sources.list.d/webupd8team-java.list \ 
    && apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EEA14886 \ 
    && echo "oracle-java8-installer shared/accepted-oracle-license-v1-1 select true" \ 
        | /usr/bin/debconf-set-selections \ 
    && apt-get update \ 
    && apt-get install -y oracle-java8-installer \ 
    && update-alternatives --display java \ 
    && rm -rf /var/lib/apt/lists/* \ 
    && apt-get clean \ 
    && R CMD javareconf 

## make sure Java can be found in rApache and other daemons not looking in R ldpaths 
RUN echo "/usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/" > /etc/ld.so.conf.d/rJava.conf 
RUN /sbin/ldconfig

# Install the R Packages from CRAN
RUN Rscript -e 'install.packages(c("Cairo", "Rcpp", "RSelenium", "httr", "rvest", "imager", "RCurl"))'

我使用了doAzureParallel包来并行执行多个脚本:

# prepare Azure batch
setwd("E:/data/R/web_scraping/zk_ba/azure")
library(doAzureParallel) 
setVerbose(TRUE)
setAutoDeleteJob(FALSE)
generateCredentialsConfig("credentials.json") 
setCredentials("credentials.json")
generateClusterConfig("cluster.json")
cluster <- makeCluster("cluster.json") 
registerDoAzureParallel(cluster) 
getDoParWorkers()
opt <- list(wait = FALSE) 

jobId <- foreach(
  i = 1:n_cluster, 
  # .packages = c("RSelenium", "imager", "httr", "RCurl", "rvest"),
  # .combine = 'rbind',
  .errorhandling = "pass",
  .options.azure = opt, 
  .export = c("metadata", "first_step", "parcele_df", "vlasnici_df", "status_teret_df", "n_cluster")
) %dopar% { 

  library(RSelenium)
  library(imager)
  library(httr)
  library(RCurl)
  library(rvest)

  #-----------------------------------#
  #    START SELENIUM AND PREPARE     #
  #-----------------------------------#

  if (first_step == TRUE) {
    tryCatch({
      rD <<- RSelenium::rsDriver(
        browser = "firefox",
        extraCapabilities = list(
          "moz:firefoxOptions" = list(
            args = list('--headless')
          )
        )
      )
    }, error = function(e) NA)
    driver <<- rD$client
    driver$open()
    driver$navigate("http://www.e-grunt.ba/")
    Sys.sleep(3L)
..
}

但是这会在许多节点上返回错误:

<simpleError in checkError(res): Undefined error in httr call. httr output: Failed to connect to localhost port 4567: Connection refused>

在需要在很多并行测试中使用RSelenium的情况下,一般会有什么建议?


但我认为我必须在虚拟机上启动驱动程序,而不是在每个节点上启动,我正在使用4个虚拟机和4个节点。如果虚拟机是相互独立的,那么为什么相同的端口会成为问题,我不知道。我还尝试了在本地端口并行运行Selenium会话,并且只调用了一次rsDriver函数。所有其他节点都成功监听了这个驱动程序的一个端口。 - Mislav
你是否正在尝试在Azure DevOps管道上运行你的案例? - Krunal Patel
1个回答

1

RSelenium 默认连接到 Selenium 服务器的端口号为 4567。一旦其中一个并行节点通过此端口连接到服务器,其他节点就无法通过此端口连接。

解决方案是在 foreach 循环中的 rsDriver 中添加以下参数:

rD <<- RSelenium::rsDriver(
        port = 4567L + as.integer(i),
        browser = "firefox",
        extraCapabilities = list(
          "moz:firefoxOptions" = list(
            args = list('--headless')
          )
        )

您可能需要检查端口与其他应用程序的冲突。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接