【问题标题】:Selenium. Upload a file on a new chrome open file pop up (or how to simulate ctrl+v on python)硒。在弹出的新chrome打开文件上上传文件(或如何在python上模拟ctrl+v)
【发布时间】:2016-12-21 07:33:59
【问题描述】:

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

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

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

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

我也尝试过使用警报和使用 selenium 更改窗口

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:ERROR: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_')]").clear() 文件“C:\Users\Silve\AppData\Local\Programs\Python\Python35-32\lib\site-packages\selenium\webdriver\remote\webelement.py”,第 87 行,清晰 self._execute(Command.CLEAR_ELEMENT) 文件“C:\Users\Silve\AppData\Local\Programs\Python\Python35-32\lib\site-packages\selenium\webdriver\remote\webelement.py”,第 461 行,在 _execute return self._parent.execute(命令,参数) 文件“C:\Users\Silve\AppData\Local\Programs\Python\Python35-32\lib\site-packages\selenium\webdriver\remote\webdriver.py”,第 236 行,在执行中 self.error_handler.check_response(响应) 文件“C:\Users\Silve\AppData\Local\Programs\Python\Python35-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py”,第 192 行,在 check_response 引发异常类(消息、屏幕、堆栈跟踪) selenium.common.exceptions.InvalidElementStateException:消息:无效元素状态:元素当前不可交互并且可能无法操作 (会话信息:chrome=52.0.2743.116) (驱动信息:chromedriver=2.9.248315,platform=Windows NT 6.3 x86_64)

【问题讨论】:

标签: python selenium keyboard


【解决方案1】:

试试下面的代码:

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_')]"

【讨论】:

  • 问题是,上传文件按钮会打开一个新的 chrome 弹出窗口,要求我提供文件,但我无法定位该提示。我试过: driver.find_element_by_id("ImageUploadButton").clear() driver.find_element_by_id("ImageUploadButton").send_keys("img") 但这并没有
  • 不,目标元素不是button,而是input。尝试右键单击按钮->“检查”->右键单击input->“复制”->“复制 OuterHTML”->将代码添加到您的工单
  • 好的,我自己做的。 HTML<input id="html5_1aq68v6j8md3ei2qhve7l1h053" style="font-size: 999px; opacity: 0; position: absolute; top: 0px; left: 0px; width: 100%; height: 100%;" multiple="" accept="image/jpeg,image/png,image/gif,image/bmp" type="file">。看来我的代码应该可以工作。我还添加了更具体的选择器
  • 很抱歉一直打扰您,这里是上传的链接。我收到此错误:“消息:无效元素状态:元素当前不可交互,可能无法被操纵”我什至尝试先单击按钮,然后稍等片刻,然后再尝试整个 clear() 和 send_leys() 和错误坚持
  • 能否提供完整代码?当我在kijiji.ca/p-post-ad.html?categoryId=12 上尝试我的代码并成功上传图片时,您的代码中可能还有另一个问题......
猜你喜欢
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
  • 2020-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多