Selenium C#无法通过Xpath在页面上找到任何元素,ID,名称

问题描述:

我对Selenium和Visual Studio相当新颖。我创建了一个测试用例来简单地登录到一个网页,并检查登录页面上的一个元素。登录是好的,我进入下一页,但是我无法通过任何方法在下一页找到任何元素,例如作为XPath,Id或名称。我得到以下几种错误...Selenium C#无法通过Xpath在页面上找到任何元素,ID,名称

OpenQA.Selenium.NoSuchElementException:no such element:无法找到元素:{“method”:“xpath”,“selector”:“// * [@ ID =“lblApplicationVersion”]“}

我还添加了一些不同的等待,如...

new WebDriverWait(driver, TimeSpan.FromSeconds(30)).Until(ExpectedConditions.ElementExists((By.XPath("//*[@id='lblApplicationVersion']")))); 

...但是这只是等待,即使页面有充分的时间绝对装载。

元素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

正如通常当我发布这个消息时,我想我已经找到了答案!看起来我需要先将驱动程序切换到帧,即... driver.SwitchTo()。Frame(frame name); – alex

+1

是的,这是问题,框架是单独的html文件 – kotoj

这是很好听你说,你已经找到了解决办法,但你应该分享它这就是为什么具有相同问题的其他用户可以更好地理解实际问题的原因。

为此,我在这里写下您的问题的解决方案。

其实frameiframe是单独HTML文件,所以你才去发现里面为低于frameiframe元素关掉这个frameiframe设置当前文档: -

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"));