首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用Chrome DevTools协议点击元素?

如何用Chrome DevTools协议点击元素?
EN

Stack Overflow用户
提问于 2020-11-26 23:05:56
回答 1查看 441关注 0票数 1

我正在使用chromote R包,并且我正在使用shiny应用程序对其进行测试。我正在尝试单击应该复制几个选择元素的图标。但是我只有工具提示,当我截图时,如果我打开浏览器,它就会冻结R进程。

下面是我的代码:

代码语言:javascript
复制
#' Run shiny in background - based on shinytest source code
#' @export
shiny.bg <- function(path, loadTimeout = 10000, shinyOptions = list()) {
  tempfile_format <- tempfile("%s-", fileext = ".log")
  p <- callr::r_bg(function(path, shinyOptions) {
    do.call(shiny::runApp, c(path, shinyOptions))
  },
  args = list(
      path = normalizePath(path),
      shinyOptions = shinyOptions
    ),
    stdout = sprintf(tempfile_format, "shiny-stdout"),
    stderr = sprintf(tempfile_format, "shiny-stderr"),
    supervise = TRUE
  )
  if (! p$is_alive()) {
    abort(paste0(
      "Failed to start shiny. Error: ",
      strwrap(readLines(p$get_error_file()))
    ))
  }
  ## Try to read out the port. Try 5 times/sec, until timeout.
  max_i <- loadTimeout / 1000 * 5
  for (i in seq_len(max_i)) {
    err_lines <- readLines(p$get_error_file())

    if (!p$is_alive()) {
      abort(paste0(
        "Error starting application:\n", paste(err_lines, collapse = "\n")
      ))
    }
    if (any(grepl("Listening on http", err_lines))) break

    Sys.sleep(0.2)
  }
  if (i == max_i) {
    abort(paste0(
      "Cannot find shiny port number. Error:\n", paste(err_lines, collapse = "\n")
    ))
  }

  line <- err_lines[grepl("Listening on http", err_lines)]
  m <- rematch::re_match(text = line, "https?://(?<host>[^:]+):(?<port>[0-9]+)")
  
  url <- sub(".*(https?://.*)", "\\1", line)
  
  list(
    process = p,
    url = url
  )
}

#' Run shiny application and Chromeote instance
chromote.shiny <- function() {
  chr <- chromote::ChromoteSession$new()
  app <- shiny.bg('.')
  
  chr$Page$navigate(app$url)
  chr$Page$loadEventFired()
  chr$screenshot()
  
  list(
    chr = chr,
    app = app
  )
}

#' kill browser and R shiny process
cleanUp <- function(obj) {
  obj$chr$Browser$close()
  obj$app$process$kill()
}

#' click on the element
chromote.click <- function(chromote, selector) {
  doc = chromote$DOM$getDocument()
  node = chromote$DOM$querySelector(doc$root$nodeId, selector)
  box <- chromote$DOM$getBoxModel(node$nodeId)
  left <- box$model$content[[1]]
  top <- box$model$content[[2]]
  x <- left + (box$model$width / 2)
  y <- top + (box$model$height / 2)
  chromote$Input$dispatchMouseEvent(type = "mousePressed", x = x, y = y, button="left")
  chromote$Input$dispatchMouseEvent(type = "mouseReleased", x = x, y = y, button="left")
}

tmp <- chromote.shiny()
chromote.click(tmp$chr, ".clone-pair")
tmp$chr$screenshot()

我不知道如何调试,也没有太多关于如何点击的信息,我在chromote的GitHub代码库中发现了dispatchMouseEvent问题。

指向repo https://github.com/rstudio/chromote的链接

我想使用chromote的原因是我想为我的应用程序创建单元/集成测试,而shinytest太过时了,它使用多年前就被废弃的phantomJS (所以你需要使用非常旧的JavaScript,因为否则pantomJS将抛出错误,测试将失败),并且RSelenium也不再被维护。

EN

回答 1

Stack Overflow用户

发布于 2021-03-31 17:37:42

有同样的问题..

我发现这个库使用了chromote,但是有很多来自RSelenium的函数(GetElement,Click)。

install.packages("remotes") remotes::install_github("rundel/hayalbaz")

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65024579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档