使用 Selenium WebDriver 在嵌套 html 框架中选择项目
Selecting item in nested html Frame with Selenium WebDriver
我正在尝试使用 Selenium WebDriver 在网页上 select 一个名为 cslLogin
的 link。它位于一个名为 topframe
的子框架中,但我无法访问它,即使在我切换到它的父框架 TopLevelFrame
之后我也可以成功访问它。 html 页面的基本布局如下:
<html>
<head>...</head>
<frameset name="ATopLevelFrameSet">
<frame name="TopLevelFrame">
#document
<html>
<head></head>
<frameset name="Aframeset">
<frame name="topframe">
#document
<html>
<head>...</head>
<body class="clsBgColor">
<table id="tblTitle">
<tbody>
<tr class="clsBackYellow"">
<td class="clsDeviceStatusLink">
<a class="clsLogin" href="javascript:void(0);"
onclick="javascript:fnnLoginClick();">Login</a> == [=11=]
etc...
我可以使用 self.driver.switch_to.frame("TopLevelFrame")
成功切换到 TopLevelFrame
,但我无法访问 topframe
或 clsLogin
(我得到 NoSuchFrameException
和 NoSuchElementException
,分别)
我试过find_element_by_name
、find_element_by_xpath
、find_element_by_link_text
、find_element_by_css_selector
,也用过
try:
element = WebDriverWait(self.driver, 10).until(
EC.presence_of_element_located((By.NAME, "TopLevelFrame"))
)
finally:
self.driver.quit()
可能是 time/page 加载问题,但在页面加载后超时。
我从其他帖子知道我需要先切换到最近的框架才能访问该元素,但这当然行不通。有什么建议么?提前致谢。
你应该使用 "find_element_by_xpath"
只需打开网站,按 "ctrl+shift+c" 并检查它你想提取什么。
找到元素中的行,右键单击并复制 xpath,粘贴到函数中。
例如,考虑这个页面来源:
<html>
<body>
<form id="loginForm">
<input name="username" type="text" />
<input name="password" type="password" />
<input name="continue" type="submit" value="Login" />
<input name="continue" type="button" value="Clear" />
</form>
</body>
<html>
表单元素可以这样定位:
login_form = driver.find_element_by_xpath("/html/body/form[1]")
login_form = driver.find_element_by_xpath("//form[1]")
login_form = driver.find_element_by_xpath("//form[@id='loginForm']")
有关详细信息,请查看 http://selenium-python.readthedocs.io/locating-elements.html
试试这个,因为您有嵌套的 iframe,切换到 TopLevelFrame,然后切换到 topframe 并执行您的 find_element_* 调用
driver.switch_to.frame(driver.find_element_by_name('TopLevelFrame'))
driver.switch_to.frame(driver.find_element_by_name('topframe'))
driver.find_element_by_class_name('clsLogin').click()
让我知道这是否有效
要点击 link cslLogin 首先你必须切换到 TopLevelFrame <frame>
然后到 topframe <frame>
然后点击link如下:
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(By.NAME,"TopLevelFrame"))
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(By.NAME,"topframe"))
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, "Login"))).click()
# Or
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//tr[@class='clsBackYellow']/td[@class='clsDeviceStatusLink']/a[@class='clsLogin']"))).click()
我正在尝试使用 Selenium WebDriver 在网页上 select 一个名为 cslLogin
的 link。它位于一个名为 topframe
的子框架中,但我无法访问它,即使在我切换到它的父框架 TopLevelFrame
之后我也可以成功访问它。 html 页面的基本布局如下:
<html>
<head>...</head>
<frameset name="ATopLevelFrameSet">
<frame name="TopLevelFrame">
#document
<html>
<head></head>
<frameset name="Aframeset">
<frame name="topframe">
#document
<html>
<head>...</head>
<body class="clsBgColor">
<table id="tblTitle">
<tbody>
<tr class="clsBackYellow"">
<td class="clsDeviceStatusLink">
<a class="clsLogin" href="javascript:void(0);"
onclick="javascript:fnnLoginClick();">Login</a> == [=11=]
etc...
我可以使用 self.driver.switch_to.frame("TopLevelFrame")
成功切换到 TopLevelFrame
,但我无法访问 topframe
或 clsLogin
(我得到 NoSuchFrameException
和 NoSuchElementException
,分别)
我试过find_element_by_name
、find_element_by_xpath
、find_element_by_link_text
、find_element_by_css_selector
,也用过
try:
element = WebDriverWait(self.driver, 10).until(
EC.presence_of_element_located((By.NAME, "TopLevelFrame"))
)
finally:
self.driver.quit()
可能是 time/page 加载问题,但在页面加载后超时。
我从其他帖子知道我需要先切换到最近的框架才能访问该元素,但这当然行不通。有什么建议么?提前致谢。
你应该使用 "find_element_by_xpath" 只需打开网站,按 "ctrl+shift+c" 并检查它你想提取什么。 找到元素中的行,右键单击并复制 xpath,粘贴到函数中。
例如,考虑这个页面来源:
<html>
<body>
<form id="loginForm">
<input name="username" type="text" />
<input name="password" type="password" />
<input name="continue" type="submit" value="Login" />
<input name="continue" type="button" value="Clear" />
</form>
</body>
<html>
表单元素可以这样定位:
login_form = driver.find_element_by_xpath("/html/body/form[1]")
login_form = driver.find_element_by_xpath("//form[1]")
login_form = driver.find_element_by_xpath("//form[@id='loginForm']")
有关详细信息,请查看 http://selenium-python.readthedocs.io/locating-elements.html
试试这个,因为您有嵌套的 iframe,切换到 TopLevelFrame,然后切换到 topframe 并执行您的 find_element_* 调用
driver.switch_to.frame(driver.find_element_by_name('TopLevelFrame'))
driver.switch_to.frame(driver.find_element_by_name('topframe'))
driver.find_element_by_class_name('clsLogin').click()
让我知道这是否有效
要点击 link cslLogin 首先你必须切换到 TopLevelFrame <frame>
然后到 topframe <frame>
然后点击link如下:
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(By.NAME,"TopLevelFrame"))
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(By.NAME,"topframe"))
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, "Login"))).click()
# Or
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//tr[@class='clsBackYellow']/td[@class='clsDeviceStatusLink']/a[@class='clsLogin']"))).click()