【问题标题】:Python selenium upload a file using windows browserPython selenium 使用 Windows 浏览器上传文件
【发布时间】:2020-01-02 03:53:22
【问题描述】:

我正在使用 selenium 在 Python 中开发一个浏览器自动化项目。我正在尝试将图片上传到页面。我登录,转到页面,然后单击上传按钮。单击上传按钮后,将打开一个 Windows 文件浏览器,我必须在其中选择文件路径并点击 Windows 浏览器上的打开按钮。我正在寻找自动化这个过程。以下是正在发生的事情的图像,以澄清:

现在,我想给出文件路径并单击打开按钮。要单击“上传照片”按钮,我使用以下代码行:

browser.find_element_by_css_selector("a._3m1z").click()

我搜索了互联网,发现了 send_keys 函数。我尝试了以下方法:

browser.find_element_by_css_selector("a._3m1z").send_keys(os.getcwd()+"/image.png")

我收到以下错误:

  File "C:\Users\Umar\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable
  (Session info: chrome=79.0.3945.88)

有人可以指出哪里出了问题并指出我正确的方向吗?我正在使用 python 3.7

【问题讨论】:

    标签: python-3.x selenium


    【解决方案1】:

    Selenium 只能与浏览器交互。单击“上传照片”按钮后出现的窗口是 Windows 文件资源管理器,与浏览器无关。您必须使用PyWinAutoAutoIt 之类的工具与文件资源管理器进行交互。

    关于您要完成的工作,有一些解决方法:(1) 使用 API,(2) 将文件路径直接传递给上传按钮等。取决于您的脚本的目的是什么(自动化 UI 测试、自动化您的某些任务等),其中一些替代方案比其他替代方案更好。

    【讨论】:

    • 我正在尝试使用 (2) 选项(将路径发送到 webelement)。它给了我不可交互的错误元素。
    • 我在下面链接的问题中有这个按钮的 html:stackoverflow.com/questions/59550882/…
    【解决方案2】:

    这是在不弹出选择器的情况下进行文件上传的想法:

    filename = 'x.jpg'
    with open(filename, "rb") as file:
      content = base64.b64encode(file.read()).decode('utf8')
    mimeType = "image/jpeg"
    selector = "input[type=file]"
    
    driver.execute_async_script("""
      const [filename, content, mimeType, selector, cb] = arguments
    
      const dt = new DataTransfer()
      const response = await fetch(`--data:${mimeType};base64,${content}`)
      const file = new File([await response.blob()], filename)
      dt.items.add(file)
    
      const element = document.querySelector(selector)
      element.files = dt.files
      element.dispatchEvent(new Event('input', { bubbles: true }))
      cb()
    """, filename, content, mimeType, selector)
    
    driver.find_element_by_css_selector('input[type=submit]').click()
    

    此外,您可能需要考虑切换到 Puppeteer 来处理此类事情,因为 Selenium 不太可能对此有很好的实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-24
      • 2013-09-22
      • 1970-01-01
      • 2020-10-18
      • 1970-01-01
      • 2016-01-10
      • 1970-01-01
      • 2016-09-13
      相关资源
      最近更新 更多