Селен Python: невозможно найти элемент (// input [@ type = 'file'] ') - PullRequest
0 голосов
/ 02 марта 2019

Я пытаюсь загрузить файл с помощью автоматизации Python.Пока я пытаюсь выполнить код ниже, python selenium выдает ошибку.Даже я пытался ждать 10 секунд, чтобы избежать проблем с синхронизацией.

driver.execute_script('window.open("https://ocr.space/" , "new window")')
Imagepath = r"C:\User\Desktop\banner.png"
field=driver.find_element_by_xpath('//input[@type="file"]')
field.send_keys(Imagepath)

NoSuchElementException: Сообщение: нет такого элемента: Невозможно найти элемент: {"method": "xpath", "selector":"// input [@ type =" file "]"}

URL веб-сайта:

https://ocr.space/

Фрагмент HTML:

<div class="span8">
  <input type="file" id="imageFile" class="form-control choose valid">
</div>

Ответы [ 3 ]

0 голосов
/ 02 марта 2019

Как правило, когда файл загрузки связанный тег <input> содержит атрибут type как file, вы можете вызвать send_keys(), чтобы заполнить соответствующий текст поле с последовательностью символов .Тем не менее, в вашем случае использования тег <input> хотя и имеет type="file", но атрибуты class равны form-control choose, а именно:

<input type="file" id="imageFile" class="form-control choose">

Таким образом, вы не сможете отправитьпоследовательность символов, вызывающая send_keys().

В этих случаях вам необходимо использовать решения на основе Auto IT .Вы можете найти пару соответствующих обсуждений в:

0 голосов
/ 02 марта 2019

Чтобы решить вашу проблему, просто замените new window на _self в следующей строке кода:

driver.execute_script('window.open("https://ocr.space/" , "_self")')

Ваш код работает нормально, но причина ошибки в том, что после запускаВ коде он запускает браузер с двумя вкладками, кроме окон, и страница будет запущена во втором окне, поэтому вам нужно переключиться в это окно перед загрузкой изображения.

Вы можете использовать дескрипторы окон для переключения в это окно.Ниже приведен код на Java, вы можете попробовать сделать то же самое с помощью Python:

// Using JavaScriptExecutor to launch the browser
JavascriptExecutor jse = (JavascriptExecutor) driver;
jse.executeScript("window.open(\"https://ocr.space/\" , \"new window\")");
// Fetching window handles and switching to the last window
Set<String> handles = driver.getWindowHandles();
for(String handle : handles) {
    driver.switchTo().window(handle);
}
// Printing window title
System.out.println(driver.getTitle());
// Uploading an image
WebElement field = driver.findElement(By.xpath("//input[@type='file']"));
String imagePath = "some image";
field.sendKeys(imagePath);

Если вы используете window.open() для запуска URL, тогда он сделает две вещи: сначала он запустит браузер с окном по умолчанию, затемон откроет URL в новой вкладке, даже если вы не указали аргумент new window в своей функции JavaScript.Вам нужно переключиться на определенное окно, чтобы выполнить какие-либо операции с ним, если вы выберете этот способ.

Чтобы избежать вышеуказанной проблемы, просто вы можете использовать driver.get(URL) или driver.navigate().to(URL), который запускает браузер и переходит копределенный URL-адрес в том же запущенном окне браузера.

Если вы хотите использовать JavaScriptExecutor только без переключения, вы можете передать _self в качестве второго аргумента функции JavaScript, как показано ниже, вместо new window, что позволяет избежатьпереключается и запускает URL в том же окне:

JavascriptExecutor jse = (JavascriptExecutor) driver;
jse.executeScript("window.open(\"https://ocr.space/\" , \"_self\")");

System.out.println(driver.getTitle());

WebElement field = driver.findElement(By.xpath("//input[@type='file']"));
String imagePath = "some image";
field.sendKeys(imagePath);

Надеюсь, это поможет ...

0 голосов
/ 02 марта 2019

Изменение кода для запуска URL с помощью get, похоже, решает проблему.

from selenium import webdriver


driver = webdriver.Chrome("./chromedriver")

driver.get("https://ocr.space/")
image = r"C:\Users\Thanthu Nair\Desktop\soc360.png"
field=driver.find_element_by_xpath('//input[@type="file"]')
field.send_keys(image)

Также убедитесь, что указанный путь C:\User\Desktop\banner.png правильный, иначе вы получите еще одно исключение.Я просто предполагаю, что этот путь может быть неправильным, потому что обычно папка Desktop находится внутри папки с именем пользователя, которая находится внутри папки User.В этом случае папка Desktop находится внутри папки User в соответствии с указанным вами путем.

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