为什么在帧内使用 "explicit wait" 会产生超时错误,但使用 "time.sleep" 却有效?

Why does using "explicit wait" inside a frame produce a timeout error, but using "time.sleep" works?

此代码有效:

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)

但我读到使用 "explicit wait" 比 "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 等)

编辑:澄清一下,"frame(3)" 和 "Element" 是同一帧,我要切换到的那个。我第二次尝试做的是使用 "webdriverwait" 而不是 "time.sleep"

这是因为在您的第二次尝试中,您没有在等待元素之前切换到框架。 Selenium 在父 window 上等待元素 10 秒,但无法在父 window 上找到它。因此超时失败。

但是在您的第一种方法中,您正在切换到使用 browser.switch_to.frame(3) 的框架,并且 selenium 能够成功地在第三个框架中找到元素。

尝试在第 3 帧添加显式等待。