Я использовал selenium и pyautogui для загрузки изображений с веб-сайта. Логика моего кода работает с использованием селена для навигации по страницам нужных мне ссылок. И с помощью pyautogui я могу объединить их для совместной работы, чтобы автоматически щелкнуть правой кнопкой мыши и загрузить изображение (хотя и не идеально) и ввести его имя файла. Проблема, с которой я сейчас сталкиваюсь, заключается в том, что диалоговое окно для сохранения изображения появляется слишком долго. Pyautogui не может ждать, пока оно всплывет, и просто вводит текст, который должен был быть введен вслепую. Мне трудно найти это и выяснить, как обнаружить всплывающее диалоговое окно. И я в настоящее время застрял с этой проблемой. Есть ли реальный способ заставить мою программу ждать, пока она не появится в самом селене? Или мне нужно использовать другой модуль в этом отношении? В таком случае, какой модуль я могу использовать?
Код для воспроизведения проблемы:
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pyautogui as auto
driver = webdriver.Chrome()
urls = [ # Sample urls.
'https://unsplash.com/photos/MAqmEdUCq4k',
'https://unsplash.com/photos/s7PhRjUJNeA',
]
# Declaring img_xpath and x for loop counting.
img_xpath = '//*[@id="app"]/div/div[2]/div/div[1]/div[3]/div/div/button/div[2]/img'
x = 0
for url in urls: # Loops through urls.
x += 1
time.sleep(2)
driver.get(url)
# Waits for the image element of the site to load.
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, img_xpath))
)
# Calculates current browser center relative to screen position.
win_pos = driver.get_window_position()
win_size = driver.get_window_size()
bcs = [ # bcs stands for Browser Center on Screen.
win_pos['x'] + int(win_size['width'] / 2),
win_pos['y'] + int(win_size['height'] / 2),
]
# Using pyautogui to save image.
auto.moveTo(bcs[0], bcs[1])
auto.click()
time.sleep(1)
auto.rightClick()
auto.moveTo(bcs[0] + 25, bcs[1] + 35)
auto.click()
time.sleep(2) # Comment out this line to reproduce the problem if your system is too fast.
auto.typewrite(f'Sample_{str(x)}')
auto.press('enter')
time.sleep(3)
driver.close()
Дополнительные примечания. В коде используется браузер Chrome с настройками по умолчанию.
Версии:
Питон → 3.8.5
PyAutoGUI → 0.9.50
селен → 3.141.0
Прошу прощения, если я что-то не так сделал, спрашивая. Это мой первый вопрос здесь на сайте. Также я новичок в python.