Selenide-无效的选择器:无法找到具有xpath表达式

时间:2016-03-20 20:55:06

标签: java selenium xpath selenium-chromedriver selenide

我正在尝试检查所需网址上找到的所有链接页面的内容。

所以我做了以下事情:

1-查找所需网址中的所有链接

2-检查链接验证(href内容)

3-导航到每个链接

5-检查每个链接的条件

    String[] links = null;
    int linksCount = 0;
    System.setProperty("webdriver.chrome.driver", "Resources/chromedriver.exe");
    WebDriverRunner.setWebDriver(new ChromeDriver());   
    driver= WebDriverRunner.getWebDriver();


    open("http://vanilla.sa/");
    List<WebElement> linksize = WebDriverRunner.getWebDriver().findElements(By.tagName("a")); 
    linksCount = linksize.size();
    links= new String[linksCount];
    out.println("List of links Available: ");  

    for(int i=0;i<linksCount;i++)
    {
        links[i] = linksize.get(i).getAttribute("href");

    } 
    // navigate to each Link on the webpage
    for(int i=0;i<linksCount;i++)
    {

        System.out.println(links[i]);
        driver.navigate().to(links[i]);
        Selenide.sleep(7);
        WebElement error = $(Selectors.byText("condition")); 
        $(error).shouldNotBe(visible)
            .shouldNotBe(text("condition"));

    }

虽然我试图检查一个网址的这个条件并且它有效但是当自动导航到不同的链接(网址)时,如上例所示
然后我有以下例外:

  

http://vanilla.sa/%D8%AD%D9%82%D8%A7%D8%A6%D8%A8/%D8%AD%D9%82%D8%A7%D8%A6%D8%A8-%D9%83%D8%A8%D9%8A%D8%B1%D8%A9   org.openqa.selenium.InvalidSelectorException:无效的选择器:由于以下错误,无法找到具有xpath表达式.//*/text()[normalize-space(.) = "condition"]/parent::*的元素:   TypeError:无法执行&#39; createNSResolver&#39; on&#39;文档&#39;:参数1不是类型&#39;节点&#39;。     (会话信息:chrome = 49.0.2623.87)     (驱动程序信息:chromedriver = 2.9.248315,platform = Windows NT 6.2 x86_64)(警告:服务器未提供任何堆栈跟踪信息)   命令持续时间或超时:74毫秒   有关此错误的文档,请访问:http://seleniumhq.org/exceptions/invalid_selector_exception.html   构建信息:版本:&#39; 2.50.1&#39;,修订版:&#39; d7fc91b&#39;,时间:&#39; 2016-01-29 19:04:49&#39;   系统信息:主持人:&#39; Hana&#39;,os.name:&#39; Windows 8&#39;,os.arch:&#39; amd64&#39;,os.version:&#39; 6.2 &#39;,java.version:&#39; 1.7.0_80&#39;   ***元素信息:{Using = xpath,value = .//*/text()[normalize-space(.) = "condition"]/parent::*}   会话ID:94c50df8d0862e2060230a819395224e   司机信息:org.openqa.selenium.chrome.ChromeDriver

3 个答案:

答案 0 :(得分:1)

您的代码失败可能是因为某些href不是链接并且正在加载空白页面。您需要过滤有效的并删除重复项。 使用Java / Selenium / ChromeDriver测试所有链接:

WebDriver driver = new ChromeDriver();
driver.get("http://vanilla.sa");

ArrayList links = (ArrayList)((JavascriptExecutor)driver).executeScript(
    "var arr = {}, l = document.links;" +
    "for(var i=0; i<l.length; i++) {" +
    "  var link = l[i].href;" +
    "  if(link.startsWith('http'))" +
    "    arr[link] = 0;" +
    "}" +
    "return Object.keys(arr);");

for (Object link : links) {
    driver.get(link.toString());
    WebElement element = driver.findElement(By.xpath("//body"));
}

答案 1 :(得分:0)

根据回溯,正在使用.///text()[normalize-space(.) = "condition"]/parent:: XPath表达式。它实际上是无效的,你可能意味着:

.//text()[normalize-space(.) = "condition"]/parent::*

答案 2 :(得分:0)

看来Florent B.的上述答案非常好。

让我就编码风格提出一些建议。我看到你没有使用Selenide语法的全部功能。您的测试可以简化:

System.setProperty("webdriver.chrome.driver",  "Resources/chromedriver.exe");
System.setProperty("selenide.browser", "chrome");

open("http://vanilla.sa/");
List<String> links = new ArrayList<>();
out.println("List of links Available: ");  

for (SelenideElement link : $$("a")) {
  links[i] = link.attr("href");
} 

// navigate to each Link on the webpage
for (String link : links) {
    System.out.println(link);
    open(link);
    sleep(7000); // this is milliseconds!
    $(byText("condition"))
        .shouldNotBe(visible)
        .shouldNotHave(text("condition"));
}