Python Selenium: как ждать и переключаться на динамический iframe? - PullRequest
0 голосов
/ 03 июля 2018

Я в настоящее время очищаю этот сайт .

На сайте есть встроенная карта Google Maps iframe. Он обновляется каждый раз, когда я ввожу адрес в поле поиска. Как проверить, пока карта не обновится?

Я сейчас использую:

 WebDriverWait(driver, 120).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".gm-style > iframe:nth-child(2)")))

Я не уверен, что это работает, потому что мой интернет слишком быстрый, чтобы я мог его проверить.

Я проверил определения ожиданий на сайте селена, но я не понимаю, что они означают.

Я также обнаружил пост , в котором используется тот же метод, но не уверен, ожидает ли он загрузки iframe только изначально или он также ожидает изменения.

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

По вашему вопросу, если вы намереваетесь переключиться на <iframe>, обозначенный как (By.CSS_SELECTOR, ".gm-style > iframe:nth-child(2)"), вам нужно заставить WebDriverWait , чтобы <iframe> был доступен, и переключиться на него и вы можете использовать следующее решение:

WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,".gm-style > iframe:nth-child(2)")))
0 голосов
/ 03 июля 2018

Я пробовал этот код:

driver.get('https://www.bungol.ca/map/location/scarborough/?')
time.sleep(3)

refresh_count = 0
while True:
    try:
        driver.refresh()
        # WebDriverWait(driver, 120).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".gm-style > iframe:nth-child(2)")))
        el = driver.find_element_by_css_selector(".gm-style > iframe:nth-child(2)")
        assert el.is_displayed()
        refresh_count += 1
    except Exception:
        print("Refresh count = " + str(refresh_count))

И вывод был:

Refresh count = 0
Refresh count = 43
Refresh count = 44
Refresh count = 56
Refresh count = 62
Refresh count = 63
Refresh count = 64
Refresh count = 68
Refresh count = 69

iframe не было в DOM в 0, 43, 44, .... Первый раз это не удалось из-за долгой первой загрузки. Тогда это было хорошо, и я решил смоделировать медленное соединение, переключив Chrome на мобильную версию. А потом это уже не часто относительно.

И тогда я установил WebDriverWait:

while True:
    try:
        driver.refresh()
        WebDriverWait(driver, 120).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".gm-style > iframe:nth-child(2)")))
        el = driver.find_element_by_css_selector(".gm-style > iframe:nth-child(2)")
        assert el.is_displayed()
        refresh_count += 1
    except Exception:
        print("Refresh count = " + str(refresh_count))

и это не исключение. Так что вы можете использовать EC.presence_of_element_...

...