Python Selenium:无法找到元素(// input [@ type ='file']')

时间:2019-03-02 12:21:19

标签: python html selenium automation

我正在尝试使用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:消息:没有这样的元素:无法找到   元素:{“方法”:“ xpath”,“选择器”:“ // input [@ type =” file“]”}

网站网址:

  

https://ocr.space/

HTML片段:

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

3 个答案:

答案 0 :(得分:2)

更改代码以使用get启动url似乎可以解决问题。

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文件夹内的文件夹内。在这种情况下,根据您提供的路径,您的桌面文件夹位于用户文件夹中。

答案 1 :(得分:1)

要解决您的问题,只需在代码的以下行中将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,则它将执行以下两项操作:首先,它将启动具有默认窗口的浏览器,然后即使您未提供new window,也会在新标签页中打开URL 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);

希望对您有帮助...

答案 2 :(得分:-1)

通常,当与文件上载相关的<input>标签包含属性type file 时,您可以调用{{1 }},以一个字符序列填充相关的文本字段。但是,在您的用例中,send_keys()标签虽然具有<input>,但type="file"属性是class,如下所示:

form-control choose

因此,您可能无法发送调用<input type="file" id="imageFile" class="form-control choose"> 的字符序列。

在这些情况下,您需要使用基于Auto IT的解决方案。您可以在以下位置找到一些相关的讨论: