如何在selenium网格节点中打开本地机器中可用的html文件



我在本地机器中有一个html文件。当我通过eclipse在本地运行seleniumjava代码时,我可以通过下面提到的代码访问html文件-

File file = new File(url);
driver.get("file:///" + file.getAbsolutePath());

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

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

您应该使用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())

您的上传现在应该可以工作了。

基本上有两种方法可以完成这项工作。我将列出这两种方法。请随意挑选适合您的。

使用自定义节点servlet

您需要遵循以下步骤:

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

它可能看起来像下面这样[这段代码是从journaldev的一篇文章中借来的,只是为了完整起见才包含在这里]你可能需要在使用之前调整代码,而不一定要按原样使用。当前代码返回一个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。有关如何完成所有这些的说明,您可以在此处参阅我的博客文章(或(在此处参阅selenium官方文档。

  2. 启动节点和-servlets参数,以便新创建的节点servlet被注入到节点中,并且可以通过http://<Node_IP_Address>:<Node_Port>/extra/UploadDownloadFileServlet(因为我们的示例servlet的名称是UploadDownloadFileServlet(

  3. 现在,在您的测试代码中,您可以一如既往地创建一个新的RemoteWebDriver实例。

  4. 现在,您需要将html文件上传到创建新会话的远程节点。为此,您需要知道运行测试的节点的IP。所以你可以使用talk2grid这样的库(我建立了这个库(,或者通过参考我的博客来利用自己确定这些信息的方法

  5. 一旦您有了IP和端口,现在就可以通过点击端点http://<Node_IP_Address>:<Node_Port>/extra/UploadDownloadFileServlet来触发对先前创建的servlet的HTTPPOST,并返回到响应中上载该servlet的路径。

  6. 现在在driver.get()调用中使用步骤(6(中返回的路径(不要忘记包括file:///协议(

应该这样。

使用Javascript

在这种方法中,您基本上是从加载一个空白页面开始的(例如,driver.get("about:blank");,然后使用Javascript通过document.createElement()调用开始动态创建您的网页(有关更多信息,请参阅本文(,并创建整个页面。您现在可以开始与页面交互了。

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

方法(2(适用于所有用例,包括第三方远程执行环境提供商,如SauceLabs或BrowserStack(如果您也使用它们(

相关内容

最新更新