我正在尝试使用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“]”}
网站网址:
HTML片段:
<div class="span8">
<input type="file" id="imageFile" class="form-control choose valid">
</div>
答案 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的解决方案。您可以在以下位置找到一些相关的讨论: