Selenium Java: невозможно загрузить файл с помощью пользовательской загрузки - PullRequest
0 голосов
/ 25 апреля 2019

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

    new WebDriverWait(driver,100).until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@id='divProfileSetting']/div/div/div/div[7]/div[2]/div/div/div/label/span")));
    WebElement UploadingFile1 = driver.findElement(By.xpath("//div[@id='divProfileSetting']/div/div/div/div[7]/div[2]/div/div/div/label/span"));
            //UploadingFile1.click();

    UploadingFile1.sendKeys("E:\\Hatha.jpg");

Исключение:

Exception in thread "main" org.openqa.selenium.ElementNotInteractableException: element not interactable
  (Session info: chrome=74.0.3729.108)
  (Driver info: chromedriver=2.46.628402 (536cd7adbad73a3783fdc2cab92ab2ba7ec361e1),platform=Windows NT 10.0.17134 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 0 milliseconds
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:25:48'
System info: host: 'RAUNAK-MA', ip: '172.27.242.131', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_201'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities {acceptInsecureCerts: false, acceptSslCerts: false, applicationCacheEnabled: false, browserConnectionEnabled: false, browserName: chrome, chrome: {chromedriverVersion: 2.46.628402 (536cd7adbad73a..., userDataDir: C:\Users\RAUNAK~1.MAS\AppDa...}, cssSelectorsEnabled: true, databaseEnabled: false, goog:chromeOptions: {debuggerAddress: localhost:55361}, handlesAlerts: true, hasTouchScreen: false, javascriptEnabled: true, locationContextEnabled: true, mobileEmulationEnabled: false, nativeEvents: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: XP, platformName: XP, proxy: Proxy(), rotatable: false, setWindowRect: true, strictFileInteractability: false, takesHeapSnapshot: true, takesScreenshot: true, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unexpectedAlertBehaviour: ignore, unhandledPromptBehavior: ignore, version: 74.0.3729.108, webStorageEnabled: true}
Session ID: 53e0b557906a50d6f51f9aa0c2bf1a14
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:214)
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:166)
    at org.openqa.selenium.remote.http.JsonHttpResponseCodec.reconstructValue(JsonHttpResponseCodec.java:40)
    at org.openqa.selenium.remote.http.AbstractHttpResponseCodec.decode(AbstractHttpResponseCodec.java:80)
    at org.openqa.selenium.remote.http.AbstractHttpResponseCodec.decode(AbstractHttpResponseCodec.java:44)
    at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158)
    at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552)
    at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:285)
    at org.openqa.selenium.remote.RemoteWebElement.sendKeys(RemoteWebElement.java:106)
    at newpackage1.flightdeckau.main(flightdeckau.java:96)

HTML:

<div class="span12 logouploadContainer">

    <input type="file" id="file" name="file" tabindex="-1" style="position: fixed; left: -9999px;">
    <div class="bootstrap-filestyle" style="display: inline;" tabindex="0">
        <input type="text" class="input-large" disabled=""> 
        <label for="file" class="btn btn-primary">
            <i class=" icon-white icon-folder-open" data-original-title="" title=""></i> 
            <span data-original-title="" title="">Choose File</span>
        </label>
    </div>

    <div id="logo-div" class="hidden">
        <button type="button" id="btnResetLogo" class="btn" style="margin-left: 5px;" data-original-title="" title="">Remove</button>
        <div id="imgContainer" style="height: 100%; width: 100px; padding: 5px; overflow: hidden;">
            <img alt="Client Logo" id="imgClient" src="">
        </div>
    </div>


</div>

Пробовал также дождаться элемента, но, похоже, у него есть некоторые проблемы.

Ответы [ 2 ]

3 голосов
/ 25 апреля 2019

Попытка загрузки файла с помощью .sendKeys () будет работать только при использовании в сочетании с <input type=file> (https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file).

При просмотре кода вы пытаетесь отправить информацию о файлек элементу <span>.

Вместо этого попробуйте:

WebDriverWait wait = new WebDriverWait(driver, 15, 100);
WebElement uploadFileElement = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("file")));
uploadFileElement.sendKeys("E:\\Hatha.jpg");

Это подождет, пока элемент <input type="file"> станет видимым, затем отправит файл с помощью sendKeys ().Это не сработает, если <input type="file"> никогда не станет видимым, в этом случае вы можете обойти проблему, сделав ее видимой с помощью JavaScript, но это будет взломом и не будет отражать действия конечного пользователя.

* РЕДАКТИРОВАТЬ *

Если вы решите пойти по пути взлома JavaScript, вы можете сделать следующее:

WebDriverWait wait = new WebDriverWait(driver, 15, 100);
WebElement uploadFileElement = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("file")));

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].style.visibility='visible'", uploadFileElement);

uploadFileElement.sendKeys("E:\\Hatha.jpg");

Обратите внимание, что ожидаемое условиетеперь ждет, пока элемент будет существовать в DOM, а не ждет, пока он станет видимым, затем мы используем JavaScript, чтобы явно сделать элемент видимым, прежде чем использовать sendKeys () для взаимодействия с ним.

Возможно, вам не нужнобрось свой дiver объект для JavascriptExecutor.Если у вас есть экземпляр RemoteWebDriver, ChromeDriver или FirefoxDriver, а не экземпляр WebDriver, метод уже доступен.

* РЕДАКТИРОВАТЬ 2 *

Просмотр этого сновареальная проблема в том, что элемент <input type="file"> был сдвинут с левой стороны экрана.Исправление, следовательно, является разновидностью вышеупомянутого.Вместо того, чтобы заставить элемент быть видимым, мы можем вместо этого использовать JavaScript, чтобы смещение было 0 вместо -9999px:

WebDriverWait wait = new WebDriverWait(driver, 15, 100);
WebElement uploadFileElement = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("file")));

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].style.left='0'", uploadFileElement);

uploadFileElement.sendKeys("E:\\Hatha.jpg");
1 голос
/ 25 апреля 2019

ElementNotInteractableException вызывается, когда элемент найден, но вы не можете взаимодействовать с ним.Например, вы не можете нажимать или отправлять ключи.

Для этого может быть несколько причин:

  1. Элемент не отображается / не отображается.
  2. Элемент находится вне экрана.
  3. Элемент находится за другим элементом или скрыт.
  4. Пользователь должен сначала выполнить какое-то другое действие, чтобы включить его.

Решение

Подождите, пока элемент станет видимым / активным для нажатия

Я вижу, вы уже добавили wait, но он настроен только наподождите до 100ms до timeout.Так что, если элемент не interactable в 100ms, ожидание закончится.Попробуйте увеличить его как минимум до 1 second i.e 1000ms или это зависит от скорости сайта.

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