【问题标题】:Pass a complicated xpath through Java Script Executor in Selenium Webdriver通过 Selenium Webdriver 中的 Java Script Executor 传递复杂的 xpath
【发布时间】:2015-07-17 23:13:59
【问题描述】:

我已使用以下 xpath 在网格上查找元素。

By.xpath("//div[contains(text(),'" +EnteredCompetitionName+ "')]/preceding-   sibling::div[contains(concat(' ', @class, ' '), ' slick-cell l0 r0 ')]/a/img"

问题是网格变得太大,并且无法通过 xpath 简单地使用 find element 找到我要查找的元素。因此我尝试在 selenium webdriver 中使用 javascript 执行器。

WebElement selectedCompGlass = (WebElement) js.executeScript("return document.evaluate('//div[contains(text(),' +EnteredCompetitionName+ ')]/preceding-sibling::div[contains(concat(\' \', @class, \' \'), \' slick-cell l0 r0 \')]/a/img' ,document, null, XPathResult.ANY_TYPE, null ).singleNodeValue;");
js.executeScript("arguments[0].click();", selectedCompGlass);

但是,我仍然收到以下错误:

参数列表后缺少) 命令持续时间或超时:8 毫秒构建信息:版本:'2.44.0',修订:'76d78cf',时间:'2014-10-23 20:02:37'

【问题讨论】:

  • 您是否尝试过实现显式等待以等待元素加载到网格中?
  • 不要认为这不是等待的问题。该元素已加载,但需要滚动才能查看。我实现了滚动并能够单击元素。但网格会越来越大,大约 15 天后,我将不得不添加更多滚动,这是我试图避免的。

标签: javascript selenium xpath selenium-webdriver


【解决方案1】:

如果滚动在您的情况下有效,那么您可以使用 javascript 滚动到 scrollIntoView 直到它找到元素然后执行您的操作。

它将滚动到元素,

WebElement element = driver.findElement(By.id("id_of_element"));
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);

【讨论】:

  • 这对我不起作用。我只能看到滚动事件发生一次。
【解决方案2】:

您可以使用其他 FindElement 或某些 Selenium 方法过滤 FindElement 结果以选择您的结果。你试过了吗?

例如,在 Selenium C# 中,我昨天写了类似的东西:

var element = browser.FindElements(By.TagName("input"), 5000)
    .FirstOrDefault(x => x.GetAttribute("data-id-selenium") == "entrar");

还有其他例子

Browser.FindElements(By.CssSelector("li[class='item-listagem']"), 5000)
    .First(x => x.Text.Contains(titulo))
    .FindElement(By.CssSelector("a[href*='AprovarAcaoLiderado']"))
    .Click();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多