Как выполнить сценарий, которого можно избежать, без создания всплывающего окна выбора файлов: Python_Selenium_GooglePhotos - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь загрузить изображения в альбомы так же, как имена каталогов.Поле ввода недоступно, пока я не нажму ссылку «Выбрать с компьютера».Если я нажму, он создаст окно поиска для выбора файлов, которые Selenium не может обработать.

Я искал в Google и StackOverflow, но не могу найти аналогичную проблему, с которой сталкиваются другие ..

google_photos_url = "https://photos.google.com/albums"
print("Opening Google Photos....")
driver.get(google_photos_url)
print("Finding Button to create new album....")
album_link = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.CSS_SELECTOR, "div.MTmRkb.XhF3Vb")))
print("Creating new album....")
album_link.click()
print("Finding element to enter album name...")
enter_album_name = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.CSS_SELECTOR, "textarea.ajQY2.v3oaBb")))
print("waiting...")
print("Entering album name....")
enter_album_name.send_keys(album_name)
print("Clicking Select photos link....")
out_of_textarea = driver.find_element_by_xpath("//div[@jscontroller ='IZGRkd']")
driver.execute_script('arguments[0].style = ""; arguments[0].style.display = "block"; arguments[0].style.visibility = "visible";',out_of_textarea)
print('Finding Select from computer link....')
select_from_computer = WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.CSS_SELECTOR, "span.VfPpkd-vQzf8d")))
driver.execute_script('arguments[0].style = ""; arguments[0].style.display = "block"; arguments[0].style.visibility = "visible";', select_from_computer)
driver.execute_script("arguments[0].click();", select_from_computer)#This is needed to create the dynamic 'input' field, yet it creates a finder pop up which just piles up.
input_field = driver.find_element_by_xpath("//input[@type = 'file']")
driver.execute_script('arguments[0].style = ""; arguments[0].style.display = "block"; arguments[0].style.visibility = "visible";', input_field)
print(input_field)
input_field.send_keys("/Volumes/path/to/jpg")

Если бы мы могли создать поле ввода, выполнив скрипт, связанный с элементом 'select_from_computer' другим способом;проблема будет решена.

1 Ответ

0 голосов
/ 27 сентября 2019

Вот решение.Сначала отключите всплывающее окно поиска ( см. ) с помощью

# disable the OS file picker
            driver.execute_script("""
                document.addEventListener('click', function(evt) {
                  if (evt.target.type === 'file')
                    evt.preventDefault();
                }, true)
                """)

Затем щелкните элемент, который генерирует элемент ввода.Затем send_keys для этого элемента.Если вы хотите отправить несколько файлов с одним и тем же элементом ввода, создайте большую строку, содержащую все пути к файлам, разделенные символом новой строки. ( см. Здесь ). Это работает для Google Photos.Вместо того, чтобы ждать определенного времени для загрузки изображений, отследите элемент css баннера с надписью «Загрузка».Если он есть, ничего не делайте, и как только он закончится (т.е. загрузка завершена и альбом загружен), сделайте следующий шаг ( см. Здесь ). Я скоро опубликую скрипт на Github.

...