python - 当我尝试使用切换到窗口来查找和处理元素时,会显示元素未找到错误
问题描述
from selenium import webdriver from selenium.webdriver.common.by import 按导入时间
类 SwtWin():
def swwn(self):
driver=webdriver.Firefox()
driver.get("https://learn.letskodeit.com/p/practice")
driver.implicitly_wait(2)
ParentWin=driver.current_window_handle
print(ParentWin)
driver.find_element_by_id("openwindow").click()
windows=driver.window_handles
print(windows)
for Tab in windows:
print(Tab)
if Tab != ParentWin:
print("Switched to sub window")
driver.switch_to.window(Tab)
print(Tab)
sel=driver.find_element_by_partial_link_text("Login")
sel.click()
driver.close()
break
driver.switch_to.window(ParentWin)
driver.execute_script("window.scrollBy(0, 1000);")
driver.quit()
解决方案
如果在元素出现在页面上之前运行元素搜索,则无法找到该元素。
在给定的代码中,当driver.find_element_by_id("openwindow").click()
它被执行时,它会打开一个新页面并sel=driver.find_element_by_partial_link_text("Login")
由于元素未呈现而失败(网络问题、笔记本电脑速度慢等)。
在这种情况下,标准解决方案是使用WebDriverWait
class 来等待元素的状态,并且只有在出现所需状态时(例如,页面上存在元素),才能继续执行。
这是示例
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.Firefox()
driver.get("https://learn.letskodeit.com/p/practice")
driver.implicitly_wait(2)
ParentWin = driver.current_window_handle
print(ParentWin)
driver.find_element_by_id("openwindow").click()
windows = driver.window_handles
print(windows)
for Tab in windows:
print(Tab)
if Tab != ParentWin:
print("Switched to sub window")
driver.switch_to.window(Tab)
print(Tab)
# wait until "Login" appers on the page
sel = WebDriverWait(driver, 5).until(
expected_conditions.visibility_of_element_located(
(By.PARTIAL_LINK_TEXT, "Login")
)
)
# work with login button
sel.click()
driver.close()
break
driver.switch_to.window(ParentWin)
driver.execute_script("window.scrollBy(0, 1000);")
driver.quit()
推荐阅读
- python-3.x - 带有 sympy 矩阵和 numpy 向量输入的 sympy lambdify
- sql-server - 有没有办法让 Excel 中的公式,通过 SQL 查询插入,自动成为公式,而无需手动刷新每个字段?
- python - 如何解决在带有英特尔芯片和 Big Sur 的 macbook pro 中安装 Python < 3.7 的“pyenv”问题?
- javascript - 将函数分配给函数内部的变量
- typescript - 为什么 Typescript 类中的箭头类成员函数不能识别参数属性的默认值?
- docker - 当安全协议为 PLAINTEXT 时,Kafka Docker Image 不会运行
- android - 如何从屏幕截图中排除叠加层?
- c++ - 您可以索引 PCAP 文件而不将其全部加载到内存中吗?
- three.js - 网络化 A 型框架对象
- c# - 我正在尝试在 Unity 中运行游戏