watir ruby ​​file загрузка windows взаимодействие - PullRequest
5 голосов
/ 30 апреля 2019

Я пытаюсь загрузить изображение в свой Instagram, поэтому мне нужно выбрать путь для загрузки файлов enter image description here

, но я не могу использовать form.file_field.send_keys(path), потому что Instagram управляет загрузкойчерез JS, поэтому форма не существует, только когда я нажимаю на кнопку «+», появляется окно «Загрузка файла».

Я пытаюсь:

 @browser.send_keys @path
 @browser.send_keys :enter

, но не работает...

Я не нашел способа взаимодействия с этим подокном "Загрузка файла", чтобы указать путь к изображению.

Есть идеи?

РЕДАКТИРОВАТЬ:

<nav class="NXc7H  f11OC "><div class="_8MQSO ZoygQ "><div class=""><div class="rBWT5"></div><div class="KGiwt"><div class="A8wCM"><div class="BvyAW"><div class="q02Nz"><a class="_0TPg" href="/"><span class="glyphsSpriteHome__outline__24__grey_9 u-__7" aria-label="Home"></span></a></div><div class="q02Nz"><a class="_0TPg" href="/explore/"><span class="glyphsSpriteSearch__outline__24__grey_9 u-__7" aria-label="Search &amp; Explore"></span></a></div><div class="q02Nz _0TPg" role="menuitem" tabindex="0"><span class="glyphsSpriteNew_post__outline__24__grey_9 u-__7" aria-label="New Post" style=""></span></div><div class="q02Nz"><a class="_0TPg " href="/accounts/activity/"><span class="glyphsSpriteHeart__outline__24__grey_9 u-__7" aria-label="Activity"></span></a></div><div class="q02Nz"><a class="_0TPg" href="/tristan_grey_30/"><span class="glyphsSpriteUser__filled__24__grey_9 u-__7" aria-label="Profile"></span></a></div></div></div></div><form class="Q9en_" enctype="multipart/form-data" method="POST" role="presentation"><input accept="image/jpeg" class="tb_sK" type="file"></form></div></div></nav>

Если я попытаюсь использовать <form>, содержащийся в <nav>, ничего не произойдет, событие "+" на событии onClick:

{
  !0 !== this.$_MobileNav2 && (this.$_MobileNav2 = !0, r(d[1]).logAction_DEPRECATED('cameraIconClick'), this.$_MobileNav3 ? (this.$_MobileNav3.selectFile(), this.props.onStartCreation()) : (i(d[2])('No image form'), this.props.onImageFormError()), this.$_MobileNav2 = !1)
}

Управляется JS Iдумаю ...

Ответы [ 3 ]

1 голос
/ 08 мая 2019

Я собираюсь пойти с небольшим взломом JavaScript, чтобы раскрыть скрытое <input type="file">.Первое, что нужно сделать, это определить тип файла ввода на странице, а затем использовать JavaScript, чтобы сделать его видимым.Затем, когда он станет видимым, используйте send_keys, чтобы передать путь к локальному файлу, а Selen должен сделать все остальное за вас.

file_upload_element = @browser.file_field
@browser.execute_script("return arguments[0].setAttribute( 'style', 'display: inline !important')", file_upload_element)
file_upload_element.set(<path_to_local_file>)

Некоторые предостережения.Я не использую Watir, я пытался написать приведенный выше код на основе документации Watir и кода, который вы предоставили, хотя это предположение.Я могу написать это на языке, который мне знаком, если это поможет.Я надеюсь, что это достаточно близко, чтобы указать вам правильное направление.

1 голос
/ 07 мая 2019

Вам не понравится ответ, но Watir будет не каким-либо образом взаимодействовать с этим окном, открываемым ОС.Идя дальше, сам Ruby не взаимодействует с этими диалогами на уровне ОС.

Есть пара вещей, на которые вы можете сослаться, чтобы подтвердить это, и это вполне приемлемо:

В любом случае вы пытаетесь взаимодействовать с объектом, с которым невозможно взаимодействовать через Ruby, не говоря уже о Watir, и, следовательно, с вашим желаемымрешение невозможно.

Ваш лучший пример - метод Капибара attach_file.Если это не сработает, ничего не выйдет за пределы буквального языка сценариев ОС, такого как AutoIt или Sikuli

. Вы можете найти страницу проекта SikuliX здесь .DrapsTV составил около часа воспроизведения плейлиста о настройке и быстром запуске SikuliX.Ссылка на первый эпизод в серии связана здесь .

Удачи.

0 голосов
/ 13 мая 2019

Как уже упоминалось в комментариях ранее, вы можете попробовать добавить элемент ввода файла в HTML, а затем использовать его для загрузки файла.

# get the frame element or any button that opens the file upload window
ele = driver.find_element_by_id("frame/button id goes here")
# add a hidden file input ( might have to change the onchange event based on the events associated to the button in above line as you don't have a form)
driver.execute_script("var x=  document.createElement('INPUT');x.setAttribute('type', 'file'); x.setAttribute('onchange','this.form.submit()');x.setAttribute('hidden', 'true'); arguments[0].appendChild(x);",ele)
# send the picture path here ( this should upload the file)
driver.find_element_by_xpath("//input[@type='file']").send_keys("picture path should go here")

Пожалуйста, попробуйте это и дайте мне знать ваш результат.

...