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ąć.
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
Przepraszamy! Chodzi mi o to, że możesz użyć executora javascript (zamiast wysyłać klucze) Zaktualizowałem teraz swoją odpowiedź –