WedX - журнал о программировании и компьютерных науках

Скрытый ввод файла Python Selenium

Я столкнулся с проблемой при попытке загрузить файл в скрытый ввод файла с помощью Python Seleniun. Чтобы было понятнее, посмотрите на изображение ниже.

Пример проблемы

Я сам загрузил один файл для первого поля. Ниже приведен пример соответствующего HTML-кода до и после загрузки.

<judge-upload caption="Output to be scored" is-uploading="submissionsCtrl.isUploading[$index]" ng-model="submissionsCtrl.newSubmissions[$index].submissionBlobKey" class="ng-pristine ng-untouched ng-valid ng-scope ng-not-empty" aria-invalid="false" style=""><div class="hcj-upload">
  <md-input-container class="md-input-has-value">
    <div class="hcj-upload-label ng-binding">Output to be scored</div>
    <div class="hcj-upload-content" ng-switch="!ctrl.fileKey">
      <!-- ngSwitchWhen: true -->
      <!-- ngSwitchWhen: false --><div ng-switch-when="false" layout="row" class="ng-scope layout-row" style="">
        <div>
          <input value="example0.out" aria-label="Filename" readonly="" class="md-input" id="input_8"><div class="md-errors-spacer"></div>
        </div>
        <div>
          <button class="md-icon-button md-button md-ink-ripple" type="button" ng-transclude="" ng-click="ctrl.onClear()" aria-label="Clear">
            <md-icon class="ng-scope material-icons" role="img" aria-hidden="true">delete</md-icon>
          </button>
        </div>
      </div><!-- end ngSwitchWhen: -->
    </div>
  </md-input-container>
</div>
</judge-upload>

*************************************

<judge-upload caption="Output to be scored" is-uploading="submissionsCtrl.isUploading[$index]" ng-model="submissionsCtrl.newSubmissions[$index].submissionBlobKey" class="ng-pristine ng-untouched ng-valid ng-scope ng-empty" aria-invalid="false"><div class="hcj-upload">
  <md-input-container class="">
    <div class="hcj-upload-label ng-binding">Output to be scored</div>
    <div class="hcj-upload-content" ng-switch="!ctrl.fileKey">
      <!-- ngSwitchWhen: true --><div ng-switch-when="true" layout="row" class="ng-scope layout-row">
        <button class="md-raised md-primary md-button md-ink-ripple" type="button" ng-transclude="" ng-click="ctrl.onUploadClick($event)" ng-disabled="!ctrl.ready || ctrl.fileName" aria-label="Upload">Upload file</button>
        <input class="hcj-upload-input ng-pristine ng-untouched ng-valid md-input ng-empty" ng-model="ctrl.fileValue" aria-label="Input file" id="input_3" aria-invalid="false" type="file"><div class="md-errors-spacer"></div>
        <div class="hcj-upload-filedrag layout-align-center-center layout-row" layout="row" ng-show="!ctrl.fileName" layout-align="center center" drag-drop="" on-drag="ctrl.onDragOver($event, $enter)" on-drop="ctrl.onDrop($event)" aria-hidden="false">
          or drop file here
        </div>
        <div class="hcj-upload-loading ng-hide layout-align-center-center layout-row" layout="row" ng-show="ctrl.fileName" layout-align="center center" aria-hidden="true">
          Uploading file. Please wait.
        </div>
      </div><!-- end ngSwitchWhen: -->
      <!-- ngSwitchWhen: false -->
    </div>
  </md-input-container>
</div>
</judge-upload>

Используя селен, я пробовал различные решения для загрузки файла, но ни одно из них не работает:

driver.find_element_by_id("input_3").send_keys(PATH)
driver.execute_script('document.getElementById("input_4").setAttribute("value",PATH)')

После второго html, похоже, обновляется путем к файлу, но не отображает его в веб-браузере.

Не могли бы вы помочь мне в этом?

Спасибо !

------ РЕДАКТИРОВАТЬ ------ Когда я отправляю файлы вторым методом, проблема заключается в том, что кнопка отправки по-прежнему отключена. Код кнопки выглядит так

<button class="md-primary md-button md-ink-ripple" type="button" ng-transclude="" ng-click="submissionsCtrl.createSubmission()" ng-disabled="!submissionsCtrl.canUploadSubmissions()" disabled="disabled">Submit</button>

Я пытался включить его с помощью кода Python, но на данный момент это не сработало, я все еще работаю над этим, если у вас есть какие-либо идеи.

driver.execute_script('document.getElementsByClassName("md-primary md-button md-ink-ripple")[0].disabled=false')
driver.find_elements_by_xpath("//*[@ng-click='submissionsCtrl.createSubmission()']")[0].click()
print driver.find_elements_by_xpath("//*[@ng-click='submissionsCtrl.createSubmission()']")[0].is_enabled()

Вывод по-прежнему показывает False для is_enabled даже после вызова скрипта, и нажатие на кнопку ничего не делает.

------ EDIT 2 ------ Наконец-то мне удалось включить кнопку и нажать на нее. К сожалению, похоже, что файлы на самом деле не отправляются формой.

Я все еще выясняю, почему файлы не отправляются.

Код, который я использовал для включения кнопки:

driver.execute_script('''document.evaluate("//*[@ng-click='submissionsCtrl.createSubmission()']", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.disabled=false''')
driver.find_elements_by_xpath("//*[@ng-click='submissionsCtrl.createSubmission()']")[0].click()
22.02.2018

  • Ваша попытка использовать execute_script ищет input_4 вместо input_3? Можно ли как-то дать ссылку на реальный сайт, где можно посмотреть? 23.02.2018
  • Спасибо за Ваш ответ. Это просто потому, что это несколько входов, и я хотел проверить их одновременно. Веб-страница находится на hashcodejudge.withgoogle.com, но, к сожалению, вы не можете ее увидеть без регистрации в конкурсе. 23.02.2018
  • Вы пытались загрузить файл, хотя браузер не отображал текст в поле после того, как execute_script поместил путь в значение? 23.02.2018
  • Если вы хотите протестировать функцию загрузки пользовательского интерфейса, это хороший вариант использования. Если вы просто хотите загрузить файл или проверить, МОЖЕТ ли загрузить файл в конечную точку, я бы рекомендовал загружать файл с помощью HTTP-запроса с использованием библиотек запросов или urllib. Намного быстрее. 23.02.2018
  • @PixelEinstein Спасибо за ваш ответ. Я пробовал это, но кнопка отключена из-за того, что файлы не загружаются. Я пытался включить кнопку вручную, но пока не удалось. Я добавлю соответствующий код в исходный пост. 24.02.2018
  • @Aphid Спасибо за ваш ответ. На самом деле проблема в том, что я понятия не имею, что такое HTTP-вызов. Я не думаю, что у меня есть способ просто отправить форму. 24.02.2018
  • Перейдите на вкладку «Сеть» инструментов разработчика вашего браузера и посмотрите, какой запрос отправляется для загрузки файла. Вся загрузка — это запрос к серверу с данными файла, вы можете имитировать этот запрос в коде и выполнять его с использованием вышеупомянутых библиотек, если у вас есть правильная аутентификация (обычно заголовки или файлы cookie). 24.02.2018

Ответы:


1

Поскольку ваша страница является страницей AngularJs, ввод файла привязан к модели ng-model="ctrl.fileValue".

Даже вы используете execute_script для установки значения в фоновом режиме, но таким образом не вызываете изменение модели fileValue.

Я предполагаю, что событие нажатия ng-click="ctrl.onUploadClick($event)" кнопки UPLOAD FILE получит путь к файлу из модели fileValue, а не из document.getElementById("input_3").value.

Таким образом, вам не удастся загрузить файл, даже если нет сообщения об ошибке.

Единственный способ решить вашу проблему — изменить значение модели fileValue напрямую:

def input_upload_file_path(file_control, file_path):
    script = '''
       angular.element(arguments[0]).scope().$apply('fileValue=arguments[1]')
    '''
    driver.execute_script(script, file_control, file_path)

file_control = driver.find_element_by_css_selector('#input_3')
file_path = <absolute path of file>

input_upload_file_path(file_control, file_path)

После выполнения input_upload_file_path() добавьте здесь паузу, после чего вы сможете проверить, нормально ли работает функция, выполнив приведенный ниже Javascript на вкладке консоли Browser DevTool:

angular.element('#input_3').scope().$eval('fileValue')

Должен печатать тот же путь к файлу, что и значение аргумента input_upload_file_path()

введите здесь описание изображения

23.02.2018
  • Большое спасибо за ответ. Я пробовал это, но думаю, что это ничего не дало, файл не загружается на вход, а запуск сценария JS в консоли выдал мне ошибку: Uncaught Error: [jqLite:nosel] errors.angularjs.org/1.6.4-local+sha.617b36117/jqLite/nosel в файле Third_Party.js:42 в Object.X [как элемент] ( Third_Party.js:64) в ‹anonymous›:1:9 24.02.2018
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]