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

时间:2017-06-24 16:25:19

标签: selenium selenium-webdriver selenium-grid selenium-grid2

以下是我的情景:

我们在selenium网格上运行我们的selenium测试套件,该网格是在jenkins的docker容器(linux box)中设置的。

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

问题:

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

我的期待:

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

由于

2 个答案:

答案 0 :(得分:2)

假设:

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

您首先需要确定您的网格将测试执行路由到哪个节点。为此,您将使用下面的技术来检索此信息(我最初将其作为gist here发布,然后写了一篇关于此here的博客,最后构建了一个名为{{的库3}}提供开箱即用的这种功能,而无需编写任何额外的代码量)

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,然后按照talk2Grid所述将其注入节点。然后通过命中servlet建立到此节点的http连接,然后将文件下载到本地计算机。无论如何,您的会话中都可以使用节点的IP和端口。
  4. 这应该可以帮到你。

    所有的说法和完成你可能还想阅读Mark Collins创建的here博客,其中讨论了为什么你不应该尝试下载文件,如果有需要,那么正确的做法是什么它

答案 1 :(得分:0)

需要共享一种方法来检查文件是否已下载到硒网格节点中的特定位置(下载位置需要在chrome选项或firefox配置文件中指定)并检查文件是否位于指定的下载目录中:

(Python中的书面代码)

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

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

 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