如何打开硒网格节点中本地计算机中可用的HTML文件

时间:2018-08-07 08:28:58

标签: selenium selenium-grid

我的本​​地计算机上有一个html文件。通过eclipse在本地运行selenium-java代码时,我可以通过下面提到的代码访问html文件-

File file = new File(url);

driver.get("file:///" + file.getAbsolutePath());

如果我通过硒网格运行代码,由于绝对路径指向本地计算机,因此注册节点不会选择要在chrome中打开的html文件路径。

是否有任何解决方案可以通过硒网格节点打开本地可用的html文件?

2 个答案:

答案 0 :(得分:0)

您应该使用LocalFileDetector。

import org.openqa.selenium.remote.LocalFileDetector
import org.openqa.selenium.remote.RemoteWebDriver

WebDriver driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), DesiredCapabilities.firefox());
driver.setFileDetector(new LocalFileDetector())

您的上传现在可以正常工作了。

答案 1 :(得分:0)

基本上有两种方法可以完成此操作。我将列出两种方法。请随时选择适合您的选项。

使用自定义节点servlet

您需要执行以下步骤:

  1. 创建一个新的自定义servlet,您可以使用它使用HTTP POST方法上传文件。

它可能看起来像下面的样子[该代码是从journaldev帖子here借来的,仅出于完整性的考虑而在此处包含]您可能需要在使用前对其进行调整,而不必按原样使用。当前代码返回一个html响应,但是您可能需要对其进行更改,以便它返回一个JSON响应,其中包含文件上传到的实际路径。此路径就是您在driver.get()通话中使用的路径。

package com.journaldev.servlet;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class UploadDownloadFileServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private ServletFileUpload uploader = null;
    @Override
    public void init() throws ServletException{
        DiskFileItemFactory fileFactory = new DiskFileItemFactory();
        File filesDir = (File) getServletContext().getAttribute("FILES_DIR_FILE");
        fileFactory.setRepository(filesDir);
        this.uploader = new ServletFileUpload(fileFactory);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String fileName = request.getParameter("fileName");
        if(fileName == null || fileName.equals("")){
            throw new ServletException("File Name can't be null or empty");
        }
        File file = new File(request.getServletContext().getAttribute("FILES_DIR")+File.separator+fileName);
        if(!file.exists()){
            throw new ServletException("File doesn't exists on server.");
        }
        System.out.println("File location on server::"+file.getAbsolutePath());
        ServletContext ctx = getServletContext();
        InputStream fis = new FileInputStream(file);
        String mimeType = ctx.getMimeType(file.getAbsolutePath());
        response.setContentType(mimeType != null? mimeType:"application/octet-stream");
        response.setContentLength((int) file.length());
        response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");

        ServletOutputStream os = response.getOutputStream();
        byte[] bufferData = new byte[1024];
        int read=0;
        while((read = fis.read(bufferData))!= -1){
            os.write(bufferData, 0, read);
        }
        os.flush();
        os.close();
        fis.close();
        System.out.println("File downloaded at client successfully");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        if(!ServletFileUpload.isMultipartContent(request)){
            throw new ServletException("Content type is not multipart/form-data");
        }

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.write("<html><head></head><body>");
        try {
            List<FileItem> fileItemsList = uploader.parseRequest(request);
            Iterator<FileItem> fileItemsIterator = fileItemsList.iterator();
            while(fileItemsIterator.hasNext()){
                FileItem fileItem = fileItemsIterator.next();
                System.out.println("FieldName="+fileItem.getFieldName());
                System.out.println("FileName="+fileItem.getName());
                System.out.println("ContentType="+fileItem.getContentType());
                System.out.println("Size in bytes="+fileItem.getSize());

                File file = new File(request.getServletContext().getAttribute("FILES_DIR")+File.separator+fileItem.getName());
                System.out.println("Absolute Path at server="+file.getAbsolutePath());
                fileItem.write(file);
                out.write("File "+fileItem.getName()+ " uploaded successfully.");
                out.write("<br>");
                out.write("<a href=\"UploadDownloadFileServlet?fileName="+fileItem.getName()+"\">Download "+fileItem.getName()+"</a>");
            }
        } catch (FileUploadException e) {
            out.write("Exception in uploading file.");
        } catch (Exception e) {
            out.write("Exception in uploading file.");
        }
        out.write("</body></html>");
    }

}
  1. 创建一个示例项目,该项目包括对selenium库的依赖关系,并且包含在步骤(1)中构建的servlet,并从中创建一个jar。有关如何执行所有这些操作的说明,请参阅我的博客文章here(或)到官方硒文档here

  2. 启动节点以及-servlets参数,以便将新创建的节点servlet注入节点并通过http://<Node_IP_Address>:<Node_Port>/extra/UploadDownloadFileServlet可用(因为我们的示例servlet的名称为{{ 1}})

  3. 现在,在测试代码中,您可以像往常一样创建新的UploadDownloadFileServlet实例。

  4. 您现在需要将html文件上传到创建新会话的远程节点。为此,您需要知道测试运行所在节点的IP。因此,您可以使用talk2grid之类的库(由我构建此库),或者通过参考我的博客here

  5. 来自行确定此信息的方法。
  6. 有了IP和端口后,您现在可以通过击中端点RemoteWebDriver并返回到响应中上载的路径,来触发对先前创建的servlet的HTTP POST。 / p>

  7. 现在在您的http://<Node_IP_Address>:<Node_Port>/extra/UploadDownloadFileServlet调用中使用步骤(6)中返回的路径(不要忘了包括driver.get()协议)

那应该做。

使用JavaScript

在这种方法中,您基本上从加载空白页开始(例如file:///,然后使用Javascript通过driver.get("about:blank");调用开始动态创建您的网页(请参阅{{ 3}}文章以获取更多信息)并创建整个页面。您现在可以开始与页面进行互动了。

方法(1)仅在使用网格环境时才有用,在网格环境中,您可以添加servlet等并访问其IP和端口。

方法(2)在所有用例中都可以使用,包括第三方远程执行环境提供者,例如SauceLabs或BrowserStack(如果您也使用它们)