2017-05-20 16 views
5

Jest to kod html załadować zdjęcie:Prześlij zdjęcie w selen python, gdy wejście ścieżka do pliku nie jest widoczny

<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> 

Stworzyłem prostą metodę, aby wysłać tekst do wejścia (nie jest widoczny na ekran):

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

Ale nic nie robi. Nie dostaję też żadnych błędów.

Więc tutaj jest drugi sposób, który może pracować:

<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> 

Tutaj użytkownik może drap i upuścić plik. Znalazłem to pytanie: Selenium: Drag and Drop from file system to webdriver?, ale nadal nie wiem, jak mogę go użyć w tej sytuacji.

Pytanie więc, jak wysłać ścieżkę do pliku wejściowego, aby załadować plik. W takim przypadku, gdy wybierzesz plik z okna dialogowego pliku lub przeciągniesz i upuścisz, zobaczysz okno potwierdzenia z podglądem na twoim zdjęciu. Więc wszystko, co pozostało do zrobienia, to kliknąć potwierdzić. Ale nie wiem, jak to wysłać w pierwszej kolejności.

Każda pomoc zostanie doceniona.

edit: znalazłem rozwiązanie (moja własna odpowiedź poniżej):

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

ale jest jeden problem: zdjęcie zostanie dodane, ale nadal otwiera okno dialogowe Plik - Nie wiem, w jaki sposób, aby zamknąć to. Próbowałem uzyskać do niego dostęp:

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

, ale nie wiem jak to zamknąć.

Odpowiedz

0

Założenie, że element jest obecny na stronie, jeśli nie jest jawnie oczekiwany na element na stronie.

następnie spróbuj tego:

driver.execute_script("document.getElementById('ID_HERE').setAttribute('value', 'PATH_HERE')"); 

nadzieja to pomoże!

+0

Przede wszystkim nie ma tam „getElementByName” w JavaScript, ale raczej „getElementsByName”, więc musiałem zrobić: document.getElementsByName ("media_empty ") [0] W każdym razie to nic nie dało. W jakiś sposób muszę utworzyć fałszywe wywołanie zwrotne z wybraną ścieżką ogniową. – Makalele

+0

Przepraszamy! Chodzi mi o to, że możesz użyć executora javascript (zamiast wysyłać klucze) Zaktualizowałem teraz swoją odpowiedź –

0

spróbować za pomocą poniższego kodu:

fileInput = driver.find_element_by_css_selector("div.image-selector label.t1-label input") 
driver.execute_script("arguments[0].setAttribute('value', 'YOUR_PATH_HERE')",fileInput) 
1

dziwo znalazłem send_keys rzeczywiście działa. Kiedy sprawdzałem kod HTML w innej przeglądarce, nie było już "media_empty", ale inna nazwa ("media []" lub coś podobnego). Zamiast Użyłem XPath i byłem zaskoczony, że faktycznie przepracowane:

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