Selenium Python - загрузка изображения, когда элемент кажется скрытым - PullRequest
0 голосов
/ 27 сентября 2019

Таким образом, в основном у меня проблема с загрузкой некоторой фотографии с использованием входного элемента Selenium Python, которая, кажется, скрыта на странице, поэтому метод .sendkeys все еще сталкивается с некоторыми ошибками.

это html-код элемента ввода

 <div data-react-class="ImageUploadForm" data-react-props="{}" data-react-cache-id="ImageUploadForm-0">
  <input class="hidden" type="file" accept="image/jpeg, image/jpg, image/png, image/gif">
  <button class="btn btn-lemonfrog text-lg" type="button">Upload photo</button>
 </div>
base_path = Path(file).parent
filepath = (basepath / "../core/attachments/clientstackphoto.jpeg").resolve()
hiddenuploaderinput.sendkeys(filepath)

прямо сейчас, после запуска кода выше, я получаю ошибку типа: value = (PosixPath ('......... / core / attachments / clientstackphoto.jpeg '),)

def keys_to_typing(value):
    """Processes the values that will be typed in the element."""
    typing = []
    for val in value:
        if isinstance(val, Keys):
            typing.append(val)
        elif isinstance(val, int):
            val = str(val)
            for i in range(len(val)):
                typing.append(val[i])
        else:
          for i in range(len(val)):

E TypeError: объект типа' PosixPath 'не имеет len ()

.. / .. / venv / lib / python3.7 / site-packages / selenium / webdriver / common / utils.py: 150: TypeError

Я ожидаю успешной загрузки фотографии, возможно, некоторыеJS инъекция поможет?

1 Ответ

0 голосов
/ 27 сентября 2019

Исходя из вашего сообщения об ошибке, я не совсем уверен, что сообщение об ошибке вызвано вводом скрытого файла.Если бы это было так, я бы ожидал ElementNotVisibleException.

. Однако я вижу, что ввод скрыт, поэтому мы должны запустить JS, чтобы выявить ввод, и, возможно, мы можем исключить это как потенциальную проблему..

Код для отображения ввода изображения

fileInput = driver.find_element_by_xpath("//input[@type='file']")

# display file input so we can send keys
driver.execute_script("arguments[0].style.display = 'block';", fileInput)

В качестве альтернативы вам может потребоваться выполнить скрипт для атрибута class вместо:

driver.execute_script("arguments[0].setAttribute('class', 'visible')", fileInput)

Как только вы выполните JSчтобы сделать ввод файла видимым, вы можете просто send_keys сделать это, как любой другой ввод:

fileInput.send_keys("PATH/TO/FILE/HERE")
...