python - 当文件路径输入不可见时在 selenium python 中上传照片

标签 python selenium

这是上传照片的html代码:

<div id="choose-photo" class="controls avatar-settings inline-upload-avatar dropdown center">
      <div class="uploader-image uploader-avatar clearfix">
        <div class="dropdown-menu">
  <div class="dropdown-caret">
    <span class="caret-outer"></span>
    <span class="caret-inner"></span>
  </div>
  <ul tabindex="-1" role="menu" aria-hidden="true">
    <li id="photo-choose-existing" class="photo-choose-existing upload-photo" role="presentation">
      <button type="button" class="dropdown-link" role="menuitem">Prześlij zdjęcie</button>
      <div class="photo-selector">
  <button class="btn" type="button">
      Zmień zdjęcie
    </button>
  <span class="photo-file-name">Nie wybrano pliku</span>
  <div class="image-selector">
    <input type="hidden" name="media_file_name" class="file-name">
    <input type="hidden" name="media_data_empty" class="file-data">
    <label class="t1-label">
      <span class="u-hiddenVisually">Dodaj zdjęcie</span>
      <input type="file" name="media_empty" class="file-input js-tooltip" tabindex="-1" accept="image/gif,image/jpeg,image/jpg,image/png" data-original-title="Dodaj zdjęcie">
    </label>
  </div>
</div>

    </li>
      <li id="photo-choose-webcam" class="u-hidden" role="presentation">
        <button type="button" class="dropdown-link">Zrób zdjęcie</button>
      </li>
    <li id="photo-delete-image" class="u-hidden" role="presentation">
      <button type="button" class="dropdown-link" role="menuitem">Usuń</button>
    </li>
      <li class="dropdown-divider" role="presentation"></li>
      <li class="cancel-options" role="presentation">
        <button type="button" class="dropdown-link" role="menuitem">Anuluj</button>
      </li>
  </ul>
</div>

</div>
</div>

我创建了一个简单的方法来将文本发送到输入(它在屏幕上不可见):

fileInput = driver.find_element_by_name('media_empty')
fileInput.send_keys(path)

但它什么也没做。我也没有收到任何错误。

所以,这是第二种可能有效的方法:

<div class="ProfileAvatarEditing-buttonContainer">
<button class="ProfileAvatarEditing-button u-boxShadowInsetUserColorHover" type="button" tabindex="2">
  <div class="ProfileAvatarEditing-addAvatarHelp">
    <span class="Icon Icon--cameraPlus"></span>
    <p>Dodaj zdjęcie profilowe</p>
  </div>
  <div class="ProfileAvatarEditing-changeAvatarHelp">
    <span class="Icon Icon--camera"></span>
    <p>Zmień zdjęcie profilowe</p>
  </div>
  <div class="ProfileAvatarEditing-dropAvatarHelp">
    <span class="Icon Icon--cameraPlus"></span>
    <p>Upuść zdięcie profilowe tutaj</p>
  </div>
</button>

用户可以在这里拖放文件。我发现了这个问题:Selenium: Drag and Drop from file system to webdriver?但是我仍然不知道在这种情况下如何使用它。

所以问题是如何将文件路径发送到输入以触发文件上传。在这种情况下,当您从文件对话框中选择一个文件或将其拖放时,您会看到带有照片预览的确认窗口。那么剩下要做的就是点击确认。但我一开始不知道如何发送。

我们将不胜感激。

编辑: 我找到了解决方案(下面是我自己的答案):

fileInput = driver.find_element_by_xpath('//*[@id="photo-choose-existing"]/div/div/label/input')
fileInput.send_keys(path)

但还有一个问题:照片已上传,但文件对话框仍然打开 - 我不知道如何关闭它。我尝试访问它:

dialog = driver.switch_to.active_element['value']

但是我不知道怎么关闭它。

最佳答案

奇怪的是,我发现 send_keys 确实有效。当我在不同的浏览器中检查 html 代码时,它不再是“media_empty”,而是一个不同的名称(“media[]”或类似的名称)。相反,我使用了 xpath,令我惊讶的是它确实有效:

fileInput = driver.find_element_by_xpath('//*[@id="photo-choose-existing"]/div/div/label/input')
fileInput.send_keys(path)

关于python - 当文件路径输入不可见时在 selenium python 中上传照片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44087408/

相关文章:

python - 为什么第一个字节打印为 (b'c\x..) 而不是 (b'x63\x..)?

python - 使用 isinstance 测试 Unicode 字符串

java - Selenium Webdriver 在 DOM 中查找元素时出错

selenium - 如何加快 AWS 设备场上的 Selenium 测试速度?

python - 当你使用Process或Pool实现多处理时,python解释器会做什么?

python - 如何转换 SVG 图像以用于 Pisa/XHTML2PDF?

python - 通过将 x 添加到前一行 pandas 来填充 na 值

java - 将鼠标悬停在菜单上并选择 java Selenium 中的子菜单

java - 如何使用 Cucumber 从 div 中检索文本?

java - 无法点击 Android 移动应用程序上 textview 消息内的链接 - Appium