使用硒选择框架



所以我正在尝试使用硒选择一个框架。我在这个堆栈溢出上找到了很多例子和类似的问题。

他们都指出,要选择框架中的元素,您首先必须"移动"到该框架,然后获取所需的元素。但我似乎无法得到我想要的框架。

我读到的所有帖子都说使用:

driver.switch_to.frame("contentfrm") # Fetch by name, or
driver.switch_to.frame(1) # Fetch by index

所以我尝试了所有这些,无论我使用什么,我总是得到一个错误,说它找不到框架,selenium.common.exceptions.NoSuchFrameException: Message: Unable to locate frame: contentfrm

蟒蛇代码:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Firefox()
driver.get("http://10.0.0.2/html/content1.asp")
driver.get("10.0.0.2")
elem = driver.find_element_by_name("Username")
elem.send_keys("admin")
elem = driver.find_element_by_name("Password")
elem.send_keys("admin2")
elem.send_keys(Keys.ENTER)
# ----
driver.switch_to.default_content()
driver.switch_to.frame("contentfrm")
# elem = driver.find_element_by_id("m8")
# driver.quit()

该 HTML 代码:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Quick Start</title>
</head>
<frameset onload="load()" rows="0,*" frameborder="0" border="0" framespacing="0">
    <frame name="topFrame" scrolling="no" src="../main/refresh.asp" __idm_frm__="200"></frame>
    <frame name="contentfrm" id="contentfrm" __idm_frm__="201"></frame>
</frameset>
</html>

注意:代码在我必须选择帧的位置正常工作。

知道为什么会这样吗

如果没有有问题的网站,很难确定问题是什么,但我会采取一些假设:

  • 您的框架集正在函数load()上执行一些 javascript,这可能会在您尝试查找元素时使元素不可用。

  • 您获得的框架元素没有src属性,因此它不会包含任何内容

  • 也许函数switchto.frame()中的选择并不像您认为的那样工作。

为了安全起见,最好等待元素可见,然后通过 xpath 选择它

element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, "//frame[@name='contentfrm']"))
)
driver.switch_to.frame(element)

正如@Rafael所说,最好使用不同的定位器,你应该检查 on load() javascript 在做什么。但是,我建议使用框架的 id 作为定位器,而不是框架名称的 xpath。

element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "contentfrm")))
driver.switch_to.frame(element)

最新更新