Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有办法在无头chrome中使用selenium上传文件?_Java_Selenium_Google Chrome Headless_Serenity Bdd - Fatal编程技术网

Java 有没有办法在无头chrome中使用selenium上传文件?

Java 有没有办法在无头chrome中使用selenium上传文件?,java,selenium,google-chrome-headless,serenity-bdd,Java,Selenium,Google Chrome Headless,Serenity Bdd,我正在创建一个脚本,需要上传一个文件,因此我编写了如下内容: @FindBy(css = "div[title='Add an attachment'] button") private WebElementFacade FILE_UPLOAD_BUTTON; Path path = Paths.get(System.getProperty("user.dir")); withTimeoutOf(20, TimeUnit.SECONDS).waitFor(Ex

我正在创建一个脚本,需要上传一个文件,因此我编写了如下内容:

    @FindBy(css = "div[title='Add an attachment'] button")
    private WebElementFacade FILE_UPLOAD_BUTTON;

    Path path = Paths.get(System.getProperty("user.dir"));

    withTimeoutOf(20, TimeUnit.SECONDS).waitFor(ExpectedConditions.visibilityOf(FILE_UPLOAD_BUTTON));
    FILE_UPLOAD_BUTTON.click();

    filePath = Paths.get(path.toString(), "FolderName", "ActualFileName.pdf");

    StringSelection fullPath = new StringSelection(filePath.toString());
    Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
    clipboard.setContents(fullPath, fullPath);

    Robot robot = new Robot();
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_V);
    robot.keyRelease(KeyEvent.VK_V);
    robot.keyRelease(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_ENTER);
    robot.keyRelease(KeyEvent.VK_ENTER);
    pause(2000);
而且它工作得很好,但在无头铬合金中就不行了。关于如何在Headless chrome中上传文件有什么想法吗?蒂亚


编辑:添加了,wakaleo怀疑Robot类能否在无头chrome上工作,因为它与真实的UI交互。我还尝试了他的建议,使用标准的Selenium操作,比如
chord org.openqa.Selenium.Keys
动作org.openqa.selenium.interactions.actions
和两者仍然不起作用

您可以使用
AutoIt
及其编辑器在selenium中上载文件

1.您需要安装
Autoit
及其脚本编辑器

我已经通过共享链接,你可以下载并使用它

  • 您需要创建autoit文件,并需要传递文件位置和一些脚本 就像我给文件Upload.au3.au3.au3的扩展名是自动的一样

    ControlFocus("Open","","Edit1")
    ControlSetText("Open","","Edit1","E:\AutoIT\id.pdf")
    ControlClick("Open","","Button1")
    
  • 您需要右键单击文件upload.au3文件并编译它,然后它将创建执行文件upload.exe

  • 然后,您需要在selenium中指定执行和上载文件的位置,就像在我的项目中单击上载按钮之后一样。我正在使用
    Runtime.getRuntime().exec(Globals.PROG_FILEUPLOAD)执行此文件

  • 其中
    Global.PROG_FILEUPLOAD
    是文件Upload.exe的路径,如

    PROG_FILEUPLOAD= "E:/AutoIT/File Upload.exe"
    
    我也分享了这个链接,如果你有任何疑问,可以作为参考


    您可以使用
    AutoIt
    及其编辑器在selenium中上载文件

    1.您需要安装
    Autoit
    及其脚本编辑器

    我已经通过共享链接,你可以下载并使用它

  • 您需要创建autoit文件,并需要传递文件位置和一些脚本 就像我给文件Upload.au3.au3.au3的扩展名是自动的一样

    ControlFocus("Open","","Edit1")
    ControlSetText("Open","","Edit1","E:\AutoIT\id.pdf")
    ControlClick("Open","","Button1")
    
  • 您需要右键单击文件upload.au3文件并编译它,然后它将创建执行文件upload.exe

  • 然后,您需要在selenium中指定执行和上载文件的位置,就像在我的项目中单击上载按钮之后一样。我正在使用
    Runtime.getRuntime().exec(Globals.PROG_FILEUPLOAD)执行此文件

  • 其中
    Global.PROG_FILEUPLOAD
    是文件Upload.exe的路径,如

    PROG_FILEUPLOAD= "E:/AutoIT/File Upload.exe"
    
    我也分享了这个链接,如果你有任何疑问,可以作为参考


    它不起作用,因为您使用的是
    Robot
    类,它不适合无头执行,因为浏览器无论如何都不可见

    确保上载元素可见

    之后,您可以使用以下内容上传:

    driver.findElement(By.id("uploadElement")).sendKeys("path/to/file");
    

    它不起作用,因为您使用的是
    Robot
    类,它不适合无头执行,因为浏览器无论如何都不可见

    确保上载元素可见

    之后,您可以使用以下内容上传:

    driver.findElement(By.id("uploadElement")).sendKeys("path/to/file");
    

    使用以下代码以无头模式上载文件:

        ChromeOptions options = new ChromeOptions();
                options.addArguments("--headless");
                WebDriver driver = new ChromeDriver(options);
                driver.get("http://nervgh.github.io/pages/angular-file-upload/examples/simple/");
                driver.findElement(By.xpath("(//input[@uploader='uploader'])[2]")).sendKeys("C:\\NotBackedUp\\Python\\selenium-2.7.0\\py\\selenium\\selenium.py");
    // Then click on some upload button
    

    在sendKeys()方法中给出要上载的文件的完整路径。

    使用以下代码以无头模式上载文件:

        ChromeOptions options = new ChromeOptions();
                options.addArguments("--headless");
                WebDriver driver = new ChromeDriver(options);
                driver.get("http://nervgh.github.io/pages/angular-file-upload/examples/simple/");
                driver.findElement(By.xpath("(//input[@uploader='uploader'])[2]")).sendKeys("C:\\NotBackedUp\\Python\\selenium-2.7.0\\py\\selenium\\selenium.py");
    // Then click on some upload button
    

    使用sendKeys()方法给出要上载的文件的完整路径。

    是的,您可以使用sendKeys进行无头chrome文件上载

    • 这里的关键点是找出合适的元素
    • sendkeys与输入标记(文件上传时的文件类型)完美配合
    • 如果输入标记引用被包装在其他标记中,请查找它
    • 查看下面的示例
    • 设置无头铬驱动程序
    • 使用sendkey发送文件

    注意:userDir-项目运行的根目录,文件分隔符-要解决跨操作系统的文件路径问题

    是的,您可以使用sendkeys进行无头chrome文件上载

    • 这里的关键点是找出合适的元素
    • sendkeys与输入标记(文件上传时的文件类型)完美配合
    • 如果输入标记引用被包装在其他标记中,请查找它
    • 查看下面的示例
    • 设置无头铬驱动程序
    • 使用sendkey发送文件

    注意:userDir-项目运行的根目录,文件分隔符-要解决跨操作系统的文件路径问题

    提供的答案不是to所要求的。感谢您的回答@akshaypatil,我按照您的建议尝试了AutoIT,但它也无法解决我的问题。AutoIT无法解决此问题,因为它在无头浏览器中不起作用。提供的答案不是TO所要求的。感谢您的回答@akshaypatil,我按照您的建议尝试了AutoIT,但它也不能解决我的问题。AutoIT无法解决此问题,因为它在无头浏览器中不起作用。我可以获取
    输入
    元素的DOM吗?i、 e.可能的重复项我可以获得
    输入
    元素的DOM吗?i、 e.可能存在的副本