Функция загрузки файлов веб-драйвера Selenium для кнопки без ввода без AutoIt или Skuliii - PullRequest
0 голосов
/ 01 ноября 2019

Мне нужно загрузить документ через Selenium WebDriver с помощью Chromedriver. Я перепробовал все классы Action и JavaScript, но они не работают. Я предполагаю, что они не работают, потому что они полагаются на кнопку в качестве поля ввода, однако кнопка загрузки, с которой я имею дело, не работает. Это HTML выглядит следующим образом:

Шаги для воспроизведения:

  • Перейти к: https://www.fedex.com/apps/printonline/#!
  • Нажмите Просмотреть продукты в разделе Маркетинговые материалы
  • Нажмите «Начало работы» в разделе «Брошюра»
  • Нажмите «Использовать ваш файл» для загрузки файла

«Использовать ваш файл»

Я могу нажать кнопку «Использовать ваш файл»,но я не уверен, как я могу загрузить файл.

driver.get("https://www.fedex.com/apps/printonline/#!");
driver.manage().window().maximize();
driver.manage().deleteAllCookies();
driver.manage().timeouts().pageLoadTimeout(40, TimeUnit.SECONDS);
driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);

//Thread.sleep(6000);

if (driver.findElement(By.xpath("//area[@alt='close']")) != null) {
    driver.findElement(By.xpath("//area[@alt='close']")).click();
}

driver.findElement(By.xpath("//a[@title='Marketing Materials']/child::button")).click();
Thread.sleep(1000);
driver.findElement(By.xpath("//a[@title='Get Started - Brochures']")).click();
Thread.sleep(1000);

WebElement element = driver.findElement(By.xpath("//*[@class='btn fxg-btn-orange  mycomputer-upload-link']"));
((JavascriptExecutor)driver).executeScript("arguments[0].click()", element);

1 Ответ

0 голосов
/ 06 ноября 2019

Хорошо, так что прежде всего избавьтесь от этих Thread.sleep(), используйте плавное ожидание с временем опроса, предпочтительно как функцию для определения местоположения элементов:

private WebElement waitFor(By locator) {
    int timeout = 10;
    FluentWait<WebDriver> wait = new FluentWait<>(driver)
            .pollingEvery(Duration.ofMillis(200))
            .withTimeout(Duration.ofSeconds(timeout))
            .ignoring(NoSuchElementException.class);
    return wait.until((driver) -> driver.findElement(locator));
}

Затем вы можете нажимать кнопки и загружатьфайл, подобный следующему:

    waitFor(By.cssSelector("button.view-products")).click();
    waitFor(By.cssSelector("a.get-started")).click();
    waitFor(By.cssSelector("a.get-started")).click();
    waitFor(By.cssSelector("input.file-upload")).sendKeys("path_to_my_file");

Обратите внимание, я использую элемент input для загрузки файла - я не нажимаю на ссылку a, так как вам не нужно это делать. Просто отправьте путь непосредственно к элементу ввода.

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