【问题标题】:How to upload file using selenium webdriver+python如何使用 selenium webdriver+python 上传文件
【发布时间】:2023-03-06 09:11:01
【问题描述】:

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

我试过了:

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

但它不起作用。是否有任何机器人可以在打开新窗口的情况下进行处理?

【问题讨论】:

  • drop zone 是什么,addphoto 是什么?
  • 放置区是我单击以打开一个窗口的区域,我必须在其中选择文件。我使用 addphoto = driver.find_element_by_xpath("html/body/div[1]/div[1]/section[2]/div/div[1]/div/form/div[1]/div[1]/div /div[1]/div[1]/img") addphoto.click()
  • 我很确定您的<img> 元素无法获取文件路径。为 dropzone 提供HTML
  • stackoverflow.com/questions/11256732/…这里有人问同样的问题。

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


【解决方案1】:

一般来说,不会。

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

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

了解如何使用动作链。

不过,这是出了名的不可靠。如果您打算将帖子自动发送到社交媒体网站,那么您可能不走运,因为它们的上传机制有点复杂,无法防止使用机器人发送垃圾邮件。

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

汉努

【讨论】:

    【解决方案2】:

    我做到了! 只需 pip install -U pyautoit

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

    工作正常:)

    【讨论】:

      【解决方案3】:

      将文件名放在 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()
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          相关资源
          最近更新 更多
          热门标签