为什么Selenium的get()方法第二次调用无法生效,仅添加time.sleep后可用
问题根因
- 点击登录提交按钮后,Selenium的
click()方法是异步触发的,只要点击动作发送到浏览器就会继续执行后续代码,不会等待登录请求处理完成、页面跳转落地后再往下走。 - 你设置的
implicitly_wait(5)仅对元素查找操作生效,对get()请求、页面跳转类场景不生效。 - 无延迟的情况下,第二个
browser.get()执行时,浏览器还在处理登录提交的响应,尚未完成登录状态同步、登录后初始跳转,新的get请求会被浏览器未完成的登录流程打断,或者触发网站登录态校验失败,最终导致跳转失效。 - 加了
time.sleep(5)后给了足够时间让登录流程完整走完,浏览器上下文稳定后再执行新的get请求,自然可以正常跳转。
更优替代方案
time.sleep()属于强制固定等待,时间设置过短达不到效果,设置过长会浪费执行时间,推荐用显式等待替代:
等待登录成功的特征条件触发,确认登录流程完成后再调用第二个get,示例代码如下:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By LOGIN = 'something@mail.com' PASS = 'somepass' LINK = 'https://stepik.org/' browser = webdriver.Chrome() browser.implicitly_wait(5) browser.get(LINK) browser.find_element_by_id('ember232').click() browser.find_element_by_name('login').send_keys(LOGIN) browser.find_element_by_name('password').send_keys(PASS) browser.find_element_by_xpath('//button[@type = "submit"]').click() # 显式等待:最多等10秒,直到登录后的用户头像元素加载出来,确认登录完成 WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'button[data-test="profile-button"]'))) # 此时再执行跳转不会失效 browser.get('https://stepik.org/lesson/237240/step/3?unit=209628')
内容的提问来源于stack exchange,提问作者Виталий Агарев
相关产品推荐
相关产品推荐

