Selenium定位不到元素的解决方法——iframe挡住了去路

上一篇 / 下一篇  2013-12-26 17:06:52 / 个人分类:Selenium

    刚接触Selenium,在调试过程中发现有些元素定位不到,于是求助了百度,查找到的资料是这么说的:如果需要定位的元素在某个frame里,则单独通过id/name/xpath是定位不到此元素的。比如,原本想通过WebElement element=driver.FindElement(By.LinkText("XXX"));来定位元素的,但由于该元素在iframe. id="left_frame"这个frame里面,所以需要先定位frame,WebElement element=driver.SwitchTo().Frame("left_frame").FindElement(By.LinkText("XXX"));
    此外还有个问题,就是相关的操作是在不同的frame中定位元素的。比如,先在left_frame中定位元素Id=TestFor1,然后在right_frame中定位元素Id=TestFor2。这种情况下,先切到left_frame,driver.SwitchTo().Frame("left_frame");再定位元素TestFor1,driver.FindElement(By.Id("TestFor1"));再切到默认的content,driver.SwitchTo().DefaultContent();再切到right_frame,driver.SwitchTo().Frame("right_frame");再定位元素TestFor2,driver.FindElement(By.Id("TestFor2"));
    在实际应用中,该方法能解决元素无法定位的问题,写了个C#通用接口(不管元素是否在frame里面),如下:
publicIWebElementGetElement(stringstrDefined,boolbFrame.=false)
{
   try
    {
        // 如果元素不在frame中,则切到默认的content
       if(!bFrame)
        {
           _webDriver.SwitchTo().DefaultContent();
        }   
  
       IWebElementele=null;
       stringstrFrame.=m_cc.GetElementFrame(strDefined);
 
        // 如果元素在frame里,先切到frame
       if(null!=strFrame.&&""!=strFrame)
        {
           IWebElementFrameEle=GetElement(strFrame,true);
           _webDriver.SwitchTo().Frame(FrameEle);
        }
 
       stringstrID=m_cc.GetElementID(strDefined);
        // 如果元素的ID为空,则通过XPath来定位元素
       if(""==strID)
        {
           stringstrXPath=m_cc.GetElementXPath(strDefined);
           ele=_webDriver.FindElement(By.XPath(strXPath));
        }
        else
        {
            // 通过ID来定位元素
            ele = _webDriver.FindElement(By.Id(strID));
        }

        return ele;
    }
    catch(NoSuchElementException)
    {
        Console.WriteLine(strDefined.ToString() + "not existed.");
        return null;
    }
}

-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

TAG:

 

评分:0

我来说两句

Open Toolbar