#python #selenium #selenium-webdriver #gecko
#python #селен #selenium-webdriver #гекко
Вопрос:
Я создаю скребок изображений для bing, потому что он имеет хорошо развитую функцию поиска по лицензии. В любом случае я не могу получить более одного изображения, потому что я не могу вернуться на главную страницу после переключения на iframe, чтобы получить src из первого изображения. Какие-нибудь советы?
import selenium
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
image_url = []
wd = webdriver.Firefox()
wait = WebDriverWait(wd, 10)
##search bing for images
search_url = f"https://www.bing.com/images/search?q=cat clipartamp;qs=namp;form=QBIRamp;qft= filterui:license-L1 filterui:imagesize-largeamp;sp=-1amp;pq=good clipartamp;sc=8-12amp;cvid=493F746CDC7B4E70BF3BEDDA3CF674E1amp;first=1amp;scenario=ImageBasicHover"
# load the page
wd.get(search_url)
thumbnail_result = wd.find_element_by_css_selector("img.mimg")
thumbnail_result.click()
wait.until(
EC.frame_to_be_available_and_switch_to_it((By.ID, "OverlayIFrame"))
)
wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, "img.nofocus"))
)
actual_image = wd.find_element_by_css_selector('img.nofocus')
image_url.append(actual_image.get_attribute('src'))
##This is where it doesn't switch back to the original webpage
wd.switch_to.default_content()
Вот код с предложенными вами изменениями:
import selenium
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
image_url = []
wd = webdriver.Firefox()
wait = WebDriverWait(wd, 10)
search_url = f"https://www.bing.com/images/search?q=cat clipartamp;qs=namp;form=QBIRamp;qft= filterui:license-L1 filterui:imagesize-largeamp;sp=-1amp;pq=good clipartamp;sc=8-12amp;cvid=493F746CDC7B4E70BF3BEDDA3CF674E1amp;first=1amp;scenario=ImageBasicHover"
# load the page
wd.get(search_url)
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "img.mimg"))).click()
wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID, "OverlayIFrame"))
)
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "img.nofocus")))
actual_image = wd.find_element_by_css_selector('img.nofocus')
image_url.append(actual_image.get_attribute('src'))
print(image_url)
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div#close"))).click()
wd.switch_to.default_content()
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "img.mimg"))).click()
Комментарии:
1.
wd.switch_to.default_content()
не возвращает вас обратно на главную страницу. Он используется для выводаiframe
. Вам нужно нажать наclose
кнопку, чтобы закрыть страницу с изображением. Как только вы нажмете на это, вы увидите главную страницу.
Ответ №1:
wd.switch_to.default_content()
не возвращает вас обратно на главную страницу.Он используется для вывода iframe
.Вам нужно нажать на close
кнопку, чтобы закрыть страницу с изображением. Как только вы нажмете на это, вы увидите главную страницу
image_url.append(actual_image.get_attribute('src'))
#Click on close button to go back to main page
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div#close"))).click()
##Now jump out from iframe
wd.switch_to.default_content()
Комментарии:
1. @KuuduK Я получаю это сообщение об ошибке:selenium.common.exceptions. Исключение ElementClickInterceptedException: Сообщение: Элемент <img class=»mimg» src=» th.bing.com/th/id /… «> не доступен для просмотра в точке (99,323), потому что другой элемент»> скрывает его
2. Используйте
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "img.mimg"))).click()
3. Получил еще одну ошибку: selenium.common.exceptions. Исключение StaleElementReferenceException: Сообщение: ссылка на элемент <img class=» nofocus» src=» th.bing.com/th/id /… «> устарел; либо элемент больше не привязан к DOM, его нет в текущем контексте фрейма, либо документ был обновлен