Я столкнулся с проблемой при попытке загрузить файл в скрытый ввод файла с помощью 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()