繁体   English   中英

硒。 上传一个新的chrome打开文件上的文件(或者如何在python上模拟ctrl + v)

[英]Selenium. Upload a file on a new chrome open file pop up (or how to simulate ctrl+v on python)

我正在为chrome webdriver做一个python selenium脚本,我需要上传一个文件。 当我点击上传按钮时,弹出一个打开的文件对话框,我无法实际上传文件。 我试过的Aproaches:

使用selenium ide,并记录我上传文件。 它产生了这个结果:

driver.find_element_by_id("html5_1aq7art6u98a1i1eokfk581u443").clear()
driver.find_element_by_id("html5_1aq7art6u98a1i1eokfk581u443").send_keys("")

但是,每次重新加载页面时,id都会更改,因此这种方法无法正常工作。 我也找不到找到表单来键入文件名的方法。

我也尝试使用警报并用硒改变窗口

driver.switch_to_window("Open")
driver.send_keyssend_keys(os.getcwd()+"/file.png")

alert = driver.switch_to.alert
alert.send_keyssend_keys(os.getcwd()+"/file.png")

但这两种方法都失败了。 (第一个没有找到窗口,第二个告诉我没有打开警报)

作为最后的手段我在搜索如何复制到剪贴板的文件的名称,并在点击上传按钮后,等待类似于秒,然后使用python模拟“crtl + v”,然后按“enter”键按,但我不知道该怎么做,互联网搜索把我带到一些基于c的第三方库的黑暗路径,这让我有些不知所措。

以下是发布脚本的完整代码,其余代码(在此部分之前)仅删除并删除我自己的帖子:

driver.get('https://www.kijiji.ca/p-post-ad.html?categoryId=87')


time.sleep(2)
driver.find_element_by_css_selector("button.button--jss-0-514").click()
driver.find_element_by_id("postad-title").clear()
driver.find_element_by_id("postad-title").send_keys(postTitle)
driver.find_element_by_id("pstad-descrptn").clear()
driver.find_element_by_id("pstad-descrptn").send_keys(postContent)
driver.find_element_by_id("pstad-map-address").clear()
driver.find_element_by_id("pstad-map-address").send_keys(postAdress)

#driver.find_element_by_id("ImageUploadButton").click()
#time.sleep(2)

driver.find_element_by_xpath("//input[@type='file'][contains(@id,'html5_')]").clear()
driver.find_element_by_xpath("//input[@type='file'][contains(@id,'html5_')]").send_keys("file.png")
driver.find_element_by_id("PhoneNumber").clear()
driver.find_element_by_id("PhoneNumber").send_keys(phoneNumber)
driver.find_element_by_id("pstad-email").send_keys(profile)
driver.find_element_by_name("saveAndCheckout").click()

完整错误:[10360:7760:0815/140356:错误:latency_info.cc(164)] RenderWidgetHostImpl :: OnSwapCompositorFrame,LatencyInfo矢量大小187太大。 [10360:7760:0815/140357:ERROR:latency_info.cc(164)] RenderWidgetHostImpl :: OnSwapCompositorFrame,LatencyInfo矢量大小452太大。 回溯(最近一次调用最后一次):文件“KijijiAutoPosting.py”,第95行,在driver.find_element_by_xpath(“// input [@ type ='file'] [contains(@ id,'html5 _')]”)。清除()文件“C:\\ Users \\ Silve \\ AppData \\ Local \\ Programs \\ Python \\ Python35-32 \\ lib \\ site-packages \\ selenium \\ webdriver \\ remote \\ webelement.py”,第87行,清除self._execute(命令.CLEAR_ELEMENT)文件“C:\\ Users \\ Silve \\ AppData \\ Local \\ Programs \\ Python \\ Python35-32 \\ lib \\ site-packages \\ selenium \\ webdriver \\ remote \\ webelement.py”,第461行,在_execute中返回self._parent .execute(command,params)文件“C:\\ Users \\ Silve \\ AppData \\ Local \\ Programs \\ Python \\ Python35-32 \\ lib \\ site-packages \\ selenium \\ webdriver \\ remote \\ webdriver.py”,第236行,执行中self.error_handler.check_response(response)文件“C:\\ Users \\ Silve \\ AppData \\ Local \\ Programs \\ Python \\ Python35-32 \\ lib \\ site-packages \\ selenium \\ webdriver \\ remote \\ errorhandler.py”,第192行, check_response raise exception_class(message,screen,stacktrace)selenium.common.exceptions.InvalidElementStateException:消息:invalid eleme nt state:元素当前不可交互,可能无法操作(会话信息:chrome = 52.0.2743.116)(驱动程序信息:chromedriver = 2.9.248315,platform = Windows NT 6.3 x86_64)

请尝试以下代码:

driver.find_element_by_xpath("//input[@type='file']").clear()
driver.find_element_by_xpath("//input[@type='file']").send_keys("/path/to/file")

如果只有一个文件上传按钮,这应该有效。

你也可以尝试这个XPath

"//input[@type='file'][contains(@id,'html5_')]"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM