链接具有Javascript时,无法通过XPath查找元素

时间:2019-03-25 15:00:44

标签: selenium xpath

我正在尝试检索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 ==“ ...

查找元素

3 个答案:

答案 0 :(得分:1)

可能的解决方案
因此,曾经/曾经 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');");

执行此操作后,我会遇到另一个问题,但是出于这个特定问题的目的,我想我可以考虑解决此问题-谢谢大家!

答案 1 :(得分:0)

您可以尝试以下CSS

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

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

答案 2 :(得分:0)

尝试使用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();;