python2.7中的Selenium+PhantomJS,文件上传

2024-04-26 23:14:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经为这个功能苦苦挣扎了几个小时了,但我无法让它以任何形式或形式工作。在

假设元素位置和图像路径始终正确。(说真的,我在过去的4个小时里一直在讨论这个问题,这不是元素位置,也不是文件路径。)

我开始使用的是输入元素的sendkeys。这不会出错,但会导致脚本永远挂起;它无法通过它,也不会上载任何图像。在

在寻找“pythonphanthomjs Selenium upload file sendkeys”时,我确实尝试了Google前4页列出的sendkeys方法的每一个可能的变体。回到绘图板上。在

目前我正在研究通过Python执行一点JavaScript来上传文件,不过我不知道该怎么做。在

我试图上载的页面的表单设置为hidden,并且只显示一个按钮,在普通浏览器上打开上载对话框。我觉得这就是sendkeys不起作用的原因。在

有谁能给我一些意见或建议作为下一步的尝试吗?或者如何从Python中执行JavaScript?在

编辑:我学会了如何在python中使用selenium时执行JavaScript,这让我省了不少时间。 对于任何来自谷歌或其他有同样问题的人,让我解释一下我所做的: 当我向input[file=input]元素发送键时,我的.send_keys()挂起了,这让我在提出这个主题之前感到疑惑,但由于Web驱动程序仍然能够找到该元素,所以我没有太多考虑它,并将其视为随机的。但是后来我提出了一个建议,因为它有一个css类型display: hidden !important,所以webdriver可能能够找到它,但是不能与它交互,出于某种原因,selenium决定挂起自己,而不是崩溃/给出错误。 考虑到这一点,我开始浏览文档,发现了.execute_script()命令,结果我们可以使用它通过webdriver运行一段JavaScript。我之所以要这样做,是想看看班级的造型是否与此有关,你怎么问?我们可以使用下面的代码行来更改input[type=file]元素的class属性:document.querySelector("input").className=""。这不是最优雅的解决方案,因为我们基本上删除了负责display: hidden !important样式的整个class。如果类要保存更重要的数据,我建议更改类,而不是将其重命名为""或删除。 继续并尝试它,它显示了输入按钮,就像我希望的那样!在这之后,我只是再次尝试发送钥匙,没有发现任何问题。不需要点击、提交或任何东西。driver.find_element_by_css_selector('input[type=file]').send_keys('path/to/file')不过,我注意到,构建路径的方式似乎非常重要。例如,我在windows上测试,path/to/file没有为我上传或选择任何图像,但是使用path\\to\\file就可以了。

tldr:

driver.execute_script('document.querySelector("input")').className=""

followed by:

driver.find_element_by_css_selector('input[type=file]').send_keys('path/to/file')

Is what worked for me, and if you are in any alike situation your variation on the script should upload the image as intended.


Tags: topath图像路径send元素inputscript