我是Selenium和Visual Studio的新手。我已经创建了一个测试用例,只需登录到一个网页并检查登录页面上的元素。登录很好,我到了下一页但是我无法通过任何方法在下一页找到任何元素作为XPath,Id或名称。我得到以下类型的错误......
OpenQA.Selenium.NoSuchElementException:没有这样的元素:无法找到元素:{“method”:“xpath”,“selector”:“// * [@ id ='lblApplicationVersion']”}
我还添加了一些不同的等待,例如......
new WebDriverWait(driver, TimeSpan.FromSeconds(30)).Until(ExpectedConditions.ElementExists((By.XPath("//*[@id='lblApplicationVersion']"))));
...但是这只是等待整个持续时间,即使页面已经明确加载。
chrome中的元素html如下......
<html>
<head>...</head>
<frameset border="0" framespacing="0" rows="100,89%" frameborder="0">
<frame name="ob_frm_header" src="header.aspx" noresize="noresize" scrolling="no">
#document
<!DOCTYPE html>
<html>
<head>...</head>
<body>
<form method="post" action="./header.aspx" id="Form1">
<div class="aspNetHidden">...</div>
<script type="text/javascript">
...
</script>
<script type="text/javascript">
...
</script>
<script type="text/javascript">
...
</script>
<div id="header">
<div id="header_left">
<a id="OEMLogoLink" href="https://observatory.spikescavell.net/" target="_parent">...</a>
<div id="application_version" class="statuspanel_application_version">
<span id="lblApplicationVersion">v4.3.4</span>
</div>
</div>
<div id="MainMenu1" onresize="MainMenuControls.MainMenuStrip.prototype.sizeChanged($get('MainMenu1'));" style="overflow: hidden; width: 1644px;" menuname="Observatory_Main" submenuleftoffset="201" submenuframe="ob_frm_main" submenuid="SubMenu1">
</div>
<div id="statuspanel">...</div>
</div>
</form>
</body>
</html>
</frame>
<frameset id="frmset_ob_menu_main" cols="201,81%" border="0" framespacing="0" frameborder="0">
<noframes>...</noframes>
</frameset>
</html>
答案 0 :(得分:0)
很高兴听到您说,您已经找到了解决方案,但是您应该分享它作为一个答案,这就是为什么有相同问题的其他用户可以更好地理解实际问题是什么的
所以为了这个目的,我在这里写下你的问题的解决方案。
实际上frame
或iframe
是单独的HTML
文档,因此您必须切换此frame
或iframe
才能设置当前文档在frame
或iframe
内查找元素,如下所示: -
IWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
wait.Until(ExpectedConditions.FrameToBeAvailableAndSwitchToIt("ob_frm_header"));
IWebElement element= wait.Until(ExpectedConditions.ElementExists(By.Id("lblApplicationVersion")));
或者,如果不需要实施WebDriverWait
,可以简单地实现如下: -
driver.SwitchTo().Frame("ob_frm_header");
IWebElement element = driver.FindElement(By.id("lblApplicationVersion"));