【问题标题】:Locate element inside frame在框架内定位元素
【发布时间】:2018-10-04 01:23:03
【问题描述】:

我有以下 HTML 代码:

<td class="gnb_menu" id="MAIN_04" name="MAIN_04" style="width:100px;text-align:center;">
  <span style="cursor:pointer;"  onclick="javascript:movePage('MAIN_04','/basis/menuServlet.do?method=getMenuUrl','body','Y')">
    <nobr>Business</nobr>
  </span>
</td>

我正在尝试获取 span 标签的 XPath。我正在使用 Selenium 并尝试过这个:

cd.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
var d = cd.FindElementByXPath("//td[@id='MAIN_04']/span[@style='cursor:pointer;']");
d.Click();

但一直遇到错误:"OpenQA.Selenium.NoSuchElementException has been thrown",因为它无法找到元素/没有这样的元素。

我尝试了许多不同的 XPath (//*[@id='MAIN_04']/span)(//td[@id='MAIN_04']/span) 等,但仍然无法做到这一点。我什至试图去掉隐式等待,因为我认为这是一个超时错误......我不知道。

请帮助我是新手,我很困惑。谢谢!

【问题讨论】:

  • XPath 是正确的。这与 XPath 无关。检查 table 是否位于 iframe 内
  • 先看看能不能顺利拿到//td[@id='MAIN_04'];悬停菜单时也会出现跨度吗?
  • @Andersson,刚刚检查,表格在 iframe 标记中。
  • 检查this ticket
  • @Ywapom ,FindElementById 只接受属性 cssvalue dashcode 属性和类型

标签: c# html selenium selenium-webdriver xpath


【解决方案1】:

经过两天研究这个小错误,我想通了!

代码在框架标签内。我的印象是只有代码在 iframe 标签内才重要,但我错了。这是我修改后的工作代码:

// Found the frame using its XPath (cd is my Chrome Driver)
IWebElement frame = cd.FindElement(By.XPath("/html/frameset/frame[2]"));
cd.SwitchTo().Frame(frame);
// Found the XPath of the span tag where my error was occurring 
IWebElement d = cd.FindElement(By.XPath("//td[@id='MAIN_04']/span"));
d.Click();

HTML 代码是:

<frame name="menu" src="/basis/common/topMenu.jsp" scrolling="no" marginwidth="0" noresize="" marginheight="0">
...
...
  <td class="gnb_menu" id="MAIN_04" name="MAIN_04" style="width:100px;text-align:center;">
    <span style="cursor:pointer;" onclick="javascript:movePage('MAIN_04','/basis/menuServlet.do?method=getMenuUrl','body','Y')">
      <nobr>Business</nobr>
  </span>
</td>

在我的情况下,我不需要切换回我的默认框架/内容,但如果你这样做:

cd.SwitchTo().DefaultContent();

在@Andersson 和iFrame Question 的帮助下得到了这个!谢谢大家:)

【讨论】:

  • 不要使用那个 XPath。任何从 HTML 标记开始或包含多于几个深度级别的定位器都是脆弱的(可能会因 HTML 的微小更改而中断)。而是使用名称属性“菜单”来引用框架。现在无论框架在 DOM 中的哪个位置,您的定位器都会找到它。见the docs
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
  • 2023-03-22
  • 2011-06-25
相关资源
最近更新 更多