【问题标题】:Unable to find Element by XPath when Link has JavascriptLink 有 Javascript 时无法通过 XPath 找到元素
【发布时间】:2019-03-25 15:00:43
【问题描述】:

我正在尝试检索 Selenium 中的超链接元素,其中链接实际上正在执行 javascript。尽管尝试了几种不同的方法,但我无法检索它。
> 元素如下所示;试图检索 test1_decode 之一:

<section id="specialsection" role="tabpanel" aria-hidden="true">
<ul class="col4">
    <li  class="header2"><a href="javascript:SetApplication('test1_decode');">Example Application</a></li>
    <li  class="header2"><a href="javascript:SetApplication('test2_decode');">Example Application POC</a></li>
</ul>
</section>

我尝试了以下方法:使用 XPath 的 FindElement 包含链接文本,使用 Xpath 的 FindElement 包含文本,PartialLinkText 的 FindElement,LinkText 的 FindElement - 都失败了。

我什至尝试将所有 都放在一个列表中;我想知道是否可能是因为它的高度为 0?

//These are the different things I've tried:
IWebElement ExAppLogin = driver.FindElement(By.XPath("//a[contains(text(), 'Example Application')]"));

IWebElement ExAppLogin = driver.FindElement(By.XPath("//a[contains(@href, 'test1_decode')]"));

IWebElement ExAppLogin = driver.FindElement(By.PartialLinkText("test1_decode"));

IWebElement ExAppLogin = driver.FindElement(By.LinkText("test1_decode"));

IWebElement ExAppLogin = driver.FindElement(By.PartialLinkText("test1_decode"));

它们都生成异常“无法使用 xpath =="...找到元素...

【问题讨论】:

  • Selenium 似乎确实有 issues with zero height elements。您是否尝试过暂时取消高度限制以查看是否可以解决问题?
  • 当您说删除高度限制时:您的意思是有一种方法可以通过忽略高度来查找/解析?或者你的意思是:修改原始页面以强制它在控件上具有高度?不幸的是,我不能做后者......
  • 欢迎来到 SO。您是否能够使用上述定位器策略在浏览器开发工具元素选项卡中找到元素?
  • 并检查您是否有任何 iframe,它包含此部分。
  • @supputuri 我做不到;我是 Selenium 的新手,所以假设我什么都不知道。我该怎么做?

标签: selenium xpath


【解决方案1】:

可能的解决方案
所以有 was/were iframe - 感谢所有评论/回复的人。
在断点处查看调试中的每一个:

driver.FindElements(By.CssSelector("iframe"));
driver.FindElements(By.TagName("iframe"));
driver.WindowHandles;

我确定有 iframe。由于这是一个 POC,我只是硬编码以检索我想要的 iframe:

driver.SwitchTo().Frame(2);

而且我能够超越这一点。奇怪的是,即使我能够找到我想要的元素:

IWebElement ExAppLogin = driver.FindElement(By.XPath("//a[contains(@href, 'test1_decode')]"));

(即我可以在调试中查看 ExAppLogin 变量详细信息,因为它不是 NULL/无异常) 但如果我这样做:

ExAppLogin.Click();

什么都没有发生!

所以目前我可以通过执行 javascript 来继续:

IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
js.ExecuteScript("SetApplication('test1_decode');");

执行此操作后,我遇到了另一个问题,但就这个特定问题而言,我想我可以考虑解决这个问题 - 谢谢大家!

【讨论】:

    【解决方案2】:

    你可以试试下面的 CSS

    driver.findElement(By.cssSelector("a[href*='test1_decode']"));
    

    *= 将匹配 href 属性中的字符串。

    【讨论】:

    • 感谢您的建议。不幸的是,我仍然遇到一个异常: Unable to find element with css selector == a[href*='test1_decode']
    【解决方案3】:

    尝试使用 XPath。如果这不起作用,请检查是否有可用的 iframe。如果,那么您必须先 Swith_to iframe 才能访问该元素。

    WebDriverWait wait = new WebDriverWait(driver, 20);
    wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[contains(text(),'Example Application')][contains(@href,'test1_decode')]"))).click();;
    

    【讨论】:

    • 没有任何 IFrame;并且由于某种原因,它没有找到我在 XPath 中输入的任何值。我认为这与它不可见/height=0 的事实有关?
    • @MattR 您是否尝试按照建议引入 WebDriverWait?
    • 我是用java做的。我不懂c#。逻辑保持不变,只是语法不同。
    • 我确实这样做了;原来我的问题与 IFrame 有关。谢谢!
    • @MattR :我告诉过你,但你之前否认了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-05
    • 2019-11-19
    • 2021-01-13
    • 1970-01-01
    • 2017-07-19
    • 2018-09-20
    • 1970-01-01
    相关资源
    最近更新 更多