Почему использование «явного ожидания» внутри кадра вызывает ошибку тайм-аута, а использование «time.sleep» работает? - PullRequest
0 голосов
/ 06 мая 2020

Этот код работает:

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
from selenium.webdriver.common.keys import Keys

# Define browser
browser = webdriver.Firefox(executable_path=r"path\geckodriver.exe")

# Open website
browser.get('website')

# Get "before" window handle
window_before = browser.window_handles[0]

# Login
searchElem = browser.find_element_by_css_selector('#login')
searchElem.send_keys('login')
searchElem2 = browser.find_element_by_css_selector('#password')
searchElem2.send_keys('password')
searchElem2.submit()

# Next page loads
time.sleep(2)
browser.switch_to.frame(3)
searchElem3 = browser.find_element_by_name('Element')
searchElem3.click()
searchElem3.send_keys('Hello')
searchElem3.send_keys(Keys.ENTER)

Но я читал, что более эффективно использовать «явное ожидание» вместо «time.sleep», поэтому я попробовал это, но этот код выдает ошибку TimeoutExceptionError:

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
from selenium.webdriver.common.keys import Keys

# Define browser
browser = webdriver.Firefox(executable_path=r"path\geckodriver.exe")

# Open website
browser.get('website')

# Get "before" window handle
window_before = browser.window_handles[0]

# Login
searchElem = browser.find_element_by_css_selector('#login')
searchElem.send_keys('login')
searchElem2 = browser.find_element_by_css_selector('#password')
searchElem2.send_keys('password')
searchElem2.submit()

# Next page loads
try:
    searchElem3 = WebDriverWait(browser, 10).until(EC.frame_to_be_available_and_switch_to_it(By.ID, "Element"))
finally:
    browser.quit()
searchElem3.click()
searchElem3.send_keys('Hello')
searchElem3.send_keys(Keys.ENTER)

Есть идеи, что я делаю не так? Я также пробовал несколько способов найти элемент безрезультатно (вместо By.ID, используя XPATH, и т.д. c)

РЕДАКТИРОВАТЬ: Просто чтобы уточнить, «frame (3)» и «Element» это тот же фрейм, на который я пытаюсь переключиться. Во второй попытке я пытался использовать «webdriverwait» вместо «time.sleep»

1 Ответ

0 голосов
/ 06 мая 2020

Это потому, что во второй попытке вы не переключаетесь на фрейм до ожидания элемента. Selenium ждал 10 секунд для элемента в родительском окне и не смог найти его в родительском окне. Следовательно, сбой с тайм-аутом.

Но в вашем 1-м подходе вы переключаетесь на usig кадра browser.switch_to.frame(3), и селен может успешно найти элемент в 3-м кадре.

Попробуйте добавить явное ждать 3-го кадра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...