Загрузка файлов не работает с Java Selenium sendkeys в Jenkins run, но работает локально

#java #maven #jenkins #selenium-webdriver

#java #мавен #дженкинс #selenium-веб-драйвер

Вопрос:

Когда я пытаюсь загрузить новый файл, используя Sendkeys в selenium с помощью Java, он работает локально, но если я запускаю тот же скрипт на сервере Jenkins, я получаю исключение как ‘org.openqa.selenium.InvalidArgumentException: недопустимый аргумент: файл не найден:’.

Ниже приведен фрагмент кода, который я написал, чтобы получить путь к файлу и передать путь к файлу с помощью sendkeys.

 private void bulkUpload(String filePath, By locator) throws InterruptedException {
    WebElement input = action.findWebElement(locator, "Upload");
    JavascriptExecutor jsx = (JavascriptExecutor) action.getWebDriver();
    jsx.executeScript("arguments[0].style.display = 'block';", input);
    Thread.sleep(1000);
    input.sendKeys(filePath);
  }
 

Заранее спасибо за вашу помощь
Консоль Дженкинса

Ответ №1:

Попробуйте использовать это решение ниже, у меня была такая же проблема, и я решил ее таким образом

* (если у вас есть исключение приведения класса на выходе, попробуйте получить веб-элемент внутри метода, который загружает файл)

 WebElement element = driver.findElement(By.id("file-upload"));
LocalFileDetector detector = new LocalFileDetector();
String path =new File("src/test/resources/testdata/sampleDocument.docx").getAbsolutePath();
File file = detector.getLocalFile(path);
((RemoteWebElement) element).setFileDetector(detector);
element.sendKeys(file.getAbsolutePath());
 

Ответ №2:

vsreekanth попробуйте отправить абсолютный путь к файлу. Я использую его таким образом, и он работает локально и в Jenkins.

Надеюсь, это сработает для вас.

параметр path — это файл в ресурсах, например: "src/main/resources/files/sampleFile.txt"

 public void uploadFile(WebElement input, String path) {
    WebElement btnUpload = input.findElement(By.xpath(".."))
            .findElement(By.xpath("..")).findElement(By.tagName("button"));
    String script = "arguments[0].style.display = 'block';";
    obtemJs().executeScript(script, input);
    input.sendKeys(new File(path).getAbsolutePath());
}
 

Комментарии:

1. Вот что такое obtemJs ()? Каков импорт для решения этой проблемы.

2. Это просто метод получения JavascriptExecutor … public JavascriptExecutor obtemJs() { return (JavascriptExecutor) getWebDriver(); }