如何使用selenium webdriver + python上传文件

时间:2016-10-27 10:20:16

标签: python selenium file-upload selenium-webdriver python-3.5

我必须上传文件(drop zone -> click ->open window to choose file)

我试过了:

addphoto.send_keys("C:\\files\\file.jpg")

但它不起作用。打开新窗口有没有机器人处理?

4 个答案:

答案 0 :(得分:2)

一般来说,没有。

Selenium只能运行您的网络浏览器。单击任何打开文件浏览器窗口的元素时,此窗口由操作系统提供,而不是Web浏览器。这就是为什么你不能在硒中与它互动的原因。

如果您的网页接受拖放操作,可能会通过使用sendkeys发送类似file:// path / to / your / file之类的内容来欺骗它,因为这就是拖拽和实际上是drop,然后使用动作链将鼠标移动到元素并执行" drop"通过向元素发送释放按钮事件。请参阅示例Unable to perform click action in selenium python

了解如何使用动作链的想法。

但这是出了名的不可靠。如果你打算自动发布帖子,比如说社交媒体网站,你可能运气不好,因为他们的上传机制在使用机器人防止垃圾邮件方面要复杂一些。

您可能想要研究允许控制计算机的整个GUI而不仅仅是浏览器的工具。然后,您可以使用Selenium尝试找到拖放字段的绝对位置,并将其提供给外部自动播放器脚本,该脚本会单击您的图像,将其拖放到该位置并将其放在那里。

哈努哈利

答案 1 :(得分:2)

我做到了! 只需点击安装-U pyautoit

然后 import autoit autoit.win_wait_active("File Upload", 5) autoit.send(os.path.join("path")) autoit.send("{ENTER}")

工作正常:)

答案 2 :(得分:1)

在dropzone隐藏输入中放置文件名可以正常工作。这应该让你去。

upload_file = driver.find_element_by_css_selector('.dz-hidden-input')
data_file = Path(__file__).parent / "test_file.txt"
logging.debug("data_file: %s", data_file)
assert data_file.exists()
upload_file.send_keys(str(data_file))
assert driver.find_element_by_css_selector('.dz-image').is_displayed()

答案 3 :(得分:0)

@Janusz Skonieczny的回答对我来说很好。 您需要当前的webdriver才能使该解决方案正常工作。如果您手边没有该变量,则可以按以下方式获取它。

from robot.libraries.BuiltIn import BuiltIn

def get_webdriver_instance():
    se2lib = BuiltIn().get_library_instance('SeleniumLibrary') #'or Selenium2Library'
    return se2lib.driver