Есть ли способ загрузить файл с помощью селена в безголовый хром? - PullRequest
0 голосов
/ 24 января 2019

Я создаю скрипт, который требует от меня загрузки файла, поэтому я пишу что-то вроде:

    @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? ТИА.

Редактировать: Добавлено запрос к спокойствию , и Вакалео сомневался, что класс Robot будет работать на Chrome без головы, поскольку он взаимодействует с реальным пользовательским интерфейсом. Я также попробовал его предложение использовать стандартные действия Selenium, такие как chord org.openqa.selenium.Keys; и actions org.openqa.selenium.interactions.Actions;, и оба они все еще не работали

Ответы [ 3 ]

0 голосов
/ 24 января 2019

Это не работает, потому что вы используете класс Robot, который не идеален для выполнения без заголовка, так как браузер все равно не виден.

Убедитесь, что ваш элемент загрузки может бытьvisible.

После этого вы загружаете со следующим:

driver.findElement(By.id("uploadElement")).sendKeys("path/to/file");
0 голосов
/ 24 января 2019

Используйте приведенный ниже код для загрузки файла в автономном режиме:

    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 ().

0 голосов
/ 24 января 2019

вы можете загрузить файл в селене, используя AutoIt и его редактор

1.Вы должны установить Autoit и его редактор сценариев

Я поделился ссылкой, через которую вы можете скачать и использовать

https://www.autoitscript.com/site/autoit/downloads/

  1. вам нужно создать файл autoit и передать его местоположение и некоторый скрипт как и назовите файл, как вы хотите, как я дал файл Upload.au3, расширение .au3 приходит автоматически

    ControlFocus("Open","","Edit1")
    ControlSetText("Open","","Edit1","E:\AutoIT\id.pdf")
    ControlClick("Open","","Button1")
    
  2. вам нужно щелкнуть правой кнопкой мыши по файлу upload.au3 и скомпилировать его, после чего он создаст исполняемый файл File Upload.exe

  3. тогда вам нужно указать в селене, где вам нужно выполнить и загрузить файл, как в моем проекте, после нажатия кнопки загрузки я выполняю этот файл, используя Runtime.getRuntime().exec(Globals.PROG_FILEUPLOAD);

где Global.PROG_FILEUPLOAD - это путь к файлу Upload.exe, например

PROG_FILEUPLOAD= "E:/AutoIT/File Upload.exe"

Я также поделился ссылкой для ссылки, которую вы можете использовать, если у вас есть какие-либо сомнения

https://www.guru99.com/use-autoit-selenium.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...