在 selenium 网格上下载 excel 文件并读取它

Downloading a excel file on selenium grid and reading it

这是我的场景:

我们 运行 我们在 selenium 网格上的 selenium 测试套件,它是在来自 jenkins 的 docker 容器(linux 盒子)中设置的。

在我的一项测试中,当我单击导出选项时,它会在 selenium 网格上下载一个 excel 文件。

问题:

我无法找到下载文件的位置(每次测试可能 运行 在 selenium 网格的不同节点中)。

我期待什么:

有人可以帮助我,如何找到文件的位置,我想我无法打开 linux 框中的 excel 文件,所以如果我可以将该文件移动到 SFTP 位置之一然后我可以连接到 SFTP 并可以读取其中的内容以进行验证。

谢谢

假设:

  • 由于您提到您正在使用 Docker,并且由于目前 Windows(或)OSX 目前没有 Docker 图片,您的浏览器是 Chrome 或 Firefox
  • 您正在使用 等技术为您的 Chrome 或 Firefox 浏览器配置默认下载位置。

您首先需要弄清楚您的网格将测试执行路由到哪个节点。为此,您将采用如下技术来检索此信息(我最初将其发布为要点here, then wrote up a blog about this here and finally built a library called talk2Grid,它提供了开箱即用的功能,而无需编写任何额外的代码)

public class GridInfoExtracter {

 private static String[] getHostNameAndPort(String hostName, int port,
  SessionId session) {
  String[] hostAndPort = new String[2];
  String errorMsg = "Failed to acquire remote webdriver node and port info. Root cause: ";

  try {
   HttpHost host = new HttpHost(hostName, port);
   DefaultHttpClient client = new DefaultHttpClient();
   URL sessionURL = new URL("http://" + hostName + ":" + port + "/grid/api/testsession?session=" + session);
   BasicHttpEntityEnclosingRequest r = new BasicHttpEntityEnclosingRequest("POST", sessionURL.toExternalForm());
   HttpResponse response = client.execute(host, r);
   JSONObject object = extractObject(response);
   URL myURL = new URL(object.getString("proxyId"));
   if ((myURL.getHost() != null) && (myURL.getPort() != -1)) {
    hostAndPort[0] = myURL.getHost();
    hostAndPort[1] = Integer.toString(myURL.getPort());
   }
  } catch (Exception e) {
   logger.log(Level.SEVERE, errorMsg, e);
   throw new RuntimeException(errorMsg, e);
  }
  return hostAndPort;
 }

 private static JSONObject extractObject(HttpResponse resp) throws IOException, JSONException {
  BufferedReader rd = new BufferedReader(new InputStreamReader(resp.getEntity().getContent()));
  StringBuffer s = new StringBuffer();
  String line;
  while ((line = rd.readLine()) != null) {
   s.append(line);
  }
  rd.close();
  JSONObject objToReturn = new JSONObject(s.toString());
  return objToReturn;
 }
}

现在您将获得 Docker 节点的 IP 和端口信息,您的测试是 运行。

您现在有两个选择:

  1. 您使用 scp(或)
  2. 从 docker 容器下载文件
  3. 您构建一个自定义 servlet,然后按照 here 的说明将其注入节点。然后你通过点击你的 servlet 建立一个到这个节点的 http 连接,然后将文件下载到你的本地机器。节点的 IP 和端口无论如何都可以从您的会话中使用。

这应该能帮到你。

综上所述,您可能还想阅读 this Mark Collins 创建的博客,其中讨论了为什么您不应该尝试下载文件,以及如果有必要,什么是正确的方法这样做。

想到分享检查文件是否下载到 selenium 网格节点中特定位置的方法(需要在 chrome 选项或 firefox 配置文件中指定下载位置)并检查文件是否存在于指定下载中目录:

(写代码在python)

传递下载目录和下载的文件名,例如,我将 C:\File_Download 设置为我的下载目录,并从应用程序中捕获下载的文件名并检查下载的相同文件:

注意:使用机器人框架内置库获取会话 ID,SSH 连接到远程机器并在远程机器中创建 selenium 网格节点。

 import requests, json
 from robot.libraries.BuiltIn import BuiltIn
 import paramiko

 def check_downloaded_file_present_in_remote_machine(dir_location, filename):
    session_id = BuiltIn().get_library_instance('SeleniumLibrary')._current_browser().session_id
    response = requests.get("http://{SeleniumHubIP}:{port}/grid/api/testsession?",params= 
   {'session':session_id})
   json_resp = response.json()
    ip_addr = json_resp['proxyId'].split('://')[1].split(':')[0]
    print ip_addr
    client = paramiko.SSHClient()
    client.load_host_keys('{home\user_directory}\.ssh\known_hosts')
    client.connect(hostname=ip_addr,port=22,username='XXXXX',password='XXXX',look_for_keys=True)
    stdin, stdout, stderr = client.exec_command('cd ' +dir_location+' && ls')
    Is_file_exist = False
    for line in stdout:
        print(line.strip('\n'))
        if filename in line.strip('\n'):
            Is_file_exist = True
    client.exec_command('cd '+dir_location+' && rm -rf *')
    client.close()
    return Is_file_exist