【问题标题】:How do I select this non-visible link lacking id with Selenium WebDriver?如何使用 Selenium WebDriver 选择这个缺少 id 的不可见链接?
【发布时间】:2015-03-05 02:35:06
【问题描述】:

我正在尝试选择此链接“用户请求”。它在鼠标悬停在菜单上时出现。

它有这个 HTML

<ul class="k-widget k-reset k-header k-menu k-menu-horizontal" id="menu" data-role="menu" tabindex="0" role="menubar" aria-activedescendant="menu_mn_active">
...
<li class="k-item js-first-level k-state-default k-state-border-down" role="menuitem" style="z-index: 100;">
  <span class="k-link js-first-level k-state-active k-state-border-down" target="">Reports/Analytics<span class="k-icon k-i-arrow-s"></span></span>
  <div class="k-animation-container" style="width: 152px; height: 145px; margin-left: -2px; padding-left: 2px; padding-right: 2px; padding-bottom: 4px; overflow: visible; display: block; position: absolute; z-index: 10002; top: 27px; left: -2.703125px;">
    <ul class="k-group k-menu-group k-popup k-reset k-state-border-up" role="menu" data-role="popup"
    style="max-height: 578px; overflow: auto; display: block; font-size: 12px; font-family: &#39;Open Sans&#39;, sans-serif; font-stretch: normal; font-style: normal; font-weight: normal; line-height: normal; position: absolute; -webkit-transform: translateY(0px);">
      <li class="k-item js-second-level k-state-default k-first" role="menuitem">
        <a class="k-link js-second-level" href="..." target="">Reports / Analytics</a>
      </li>
      <li class="k-item js-second-level k-state-default" role="menuitem">
        <a class="k-link js-second-level" href="..." target="">User Requested</a>
      </li>

XPath

//*[@id="menu"]/li[10]/div/ul/li[2]/a

代码

  echo "Switching to mainFrame\n";
  $driver->switchTo()->frame("mainFrame");
  echo "Finding link Reports/Analytics\n";
  //$input = $driver->findElement(WebDriverBy::partialLinkText('Reports/Analytics')); #didn't work
  $input = $driver->findElement(WebDriverBy::xpath('//*[@id="menu"]/li[10]/span'));
  $input->click();
  echo "Finding link User Requested\n";
  // $input = $driver->findElement(WebDriverBy::partialLinkText('User Requested')); # didn't work
  $input = $driver->findElement(WebDriverBy::xpath('//*[@id="menu"]/li[10]/div/ul/li[2]/a'));
  $input->click();

错误

Switching to mainFrame
Finding link Reports/Analytics
Finding link User Requested
PHP Fatal error:  Uncaught exception 'NoSuchElementException' with message 'no such element

似乎无论我尝试什么,它都行不通。该链接没有id


我设法点击了 a 链接,但它选择了错误的链接!我正在使用 Chrome 右键单击​​元素以获取 CSS 路径和​​ XPath。 (某些 JavaScript 会在选择菜单时设置一个 id menu_mn_active。)元素显示文本是正确的,但它会转到错误的页面。

  echo "Finding link User Requested\n";
  // $input = $driver->findElement(WebDriverBy::partialLinkText('User Requested'));
  // $input = $driver->findElement(WebDriverBy::cssSelector('#menu_mn_active > div > ul > li:nth-child(2) > a'));
  // $input = $driver->findElement(WebDriverBy::xpath('//*[@id="menu"]/li[10]/div/ul/li[2]/a'));  
  $input = $driver->findElement(WebDriverBy::xpath('//*[@id="menu_mn_active"]/div/ul/li[2]/a'));
  echo("Link text: ".$input->getText()."\n");  
  $input->click();
  echo "Finding link Export Employees To Bamboo\n";

输出

Finding link User Requested
Link text: User Requested
Finding link Export Employees To Bamboo
PHP Fatal error:  Uncaught exception 'NoSuchElementException' 

我在尝试单击下拉菜单中的项目时也经常遇到此错误:

PHP Fatal error:  Uncaught exception 'ElementNotVisibleException' with message 'element not visible

【问题讨论】:

  • 我在您的 HTML 中看不到 id 属性。
  • @zerkms #menu id 在给定的 HTML 之前。我会添加它。 &lt;a&gt; 没有 id
  • 如果您在 chrome 元素选项卡中使用 //*[@id="menu"]/li[10]/div/ul/li[2]/a 选择器并尝试使用它进行搜索 - 它会找到任何东西吗?
  • 如果找不到 - 则没有匹配的元素。对于测试,我永远不会做你刚才所做的事情——所有的 xpath 都必须经过深思熟虑的编写,因为这就是你“保证”测试运行良好的方式。
  • @zerkms 好吧,我使用 Chrome 并右键单击元素并选择“复制 XPath”,这就是我获得 XPath 的方式。我不知道我可以使用 find 和 XPaths。实际上,当我使用完整路径时,它确实找到了 XPath。我无法选择 HTML,因为这是呈现的内容,我无法控制它。

标签: php html selenium xpath selenium-webdriver


【解决方案1】:

我会将 xpath 简化为以下内容。正如其他人所说,使用 chrome 为您生成 xpath 确实不是一个好主意 - 或者如果您确实对其进行了一些思考。以我的经验,chrome 通常不会在所有情况下生成正确或最有效的 xpath。

//a[contains(text(),'User Requested')]

【讨论】:

  • 这是个好建议,但在不改变浏览器大小的情况下,它仍然给出了ElementNotVisibleException
  • 我不打算投票,因为它没有帮助,我已经尝试过 partialLinkText,但我不知道 XPath 的语法,它对 &lt;spans&gt; 很有帮助不符合partialLinkText 的条件。
【解决方案2】:

OMFG 是因为Chrome驱动弹出的浏览器窗口的大小。窗口是一个奇怪的形状,比正常的更窄,我试图点击的元素稍微超出了视口几个像素,尽管它对我来说是清晰可见的。当我手动调整窗口大小时,一切正常!我在会话开始附近添加了这一行并且它有效:

  $driver->manage()->window()->maximize();

如果我的鼠标悬停在窗口上,它也不起作用!我必须添加一个sleep() 来等待菜单滑出。太脆了!

【讨论】:

    猜你喜欢
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 2013-04-27
    • 2020-12-31
    • 1970-01-01
    相关资源
    最近更新 更多