WebDriver新标签页打开窗口后无法读取页面元素的问题咨询
问题
尝试读取新标签页窗口元素的代码执行后始终显示“not enetered”:
webd = webdriver.Chrome(service=s, options=options) url = "some url" webd.execute_script("window.open('" + url + "','_blank');") if len(webd.find_elements(By.TAG_NAME, "pre")) > 0: print("entered") else: print("not enetered")
若在同一标签页打开URL,代码可正常运行:
webd = webdriver.Chrome(service=s, options=options) url = "some url" webd.get(url) if len(webd.find_elements(By.TAG_NAME, "pre")) > 0: print("entered") else: print("not enetered")
请问在新标签页的代码中,是否遗漏了某些关键步骤?
解决方案
你确实遗漏了两个关键步骤:
- 切换到新标签页上下文:WebDriver默认会停留在原窗口的操作上下文里,执行
window.open后不会自动切换到新标签页。需要通过window_handles获取所有窗口句柄,切换到新打开的标签页(通常是句柄列表的最后一个)。 - 等待页面元素加载:新标签页打开后,页面需要时间加载完成,直接查找元素可能因为DOM未渲染完毕导致找不到,建议用显式等待确保目标元素存在。
修正后的代码示例:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC webd = webdriver.Chrome(service=s, options=options) url = "some url" # 记录原窗口句柄 original_window = webd.current_window_handle # 打开新标签页 webd.execute_script("window.open('" + url + "','_blank');") # 切换到新标签页 for handle in webd.window_handles: if handle != original_window: webd.switch_to.window(handle) break # 等待pre元素加载完成 try: WebDriverWait(webd, 10).until( EC.presence_of_element_located((By.TAG_NAME, "pre")) ) print("entered") except: print("not enetered")
内容的提问来源于stack exchange,提问作者Pankaj
相关产品推荐
相关产品推荐

