使用Selenium Webdriver找不到元素

时间:2018-05-15 23:48:39

标签: java selenium selenium-webdriver webdriver automated-tests

我正试图导航到" https://developers.google.com/"。

然后我点击xpath的链接并重定向到另一个页面。

在第一页上找到元素和点击链接时,一切都有效。

但是在进入新页面之后,我似乎找不到想要查找的元素。

重定向的网页是" https://cloud.withgoogle.com/next18/sf/?utm_source=devsite&utm_medium=hpp&utm_campaign=cloudnext_april18"

这是检查文本是否相等。

   confirmText("Imagine", "//*[@id=\"main\"]/span/div[2]/div/div/div[1]/div[1]/div/div[1]/div[2]/h3");

    public static void confirmText(String text, String xpath) {
    System.out.println("Trying to confirm that given string is equal to the text on page.");
    WebElement element = driver.findElement(By.xpath(xpath));
    System.out.println("Test case: " + text);
    System.out.println("Result: " + element.getText());
    if (element.getText() == text) {
        System.out.println("\nEquals.");
    }
    else {
        System.out.println("\nDoes not equals.");
    }
    System.out.println("\n\n");
}

这是发送密钥。

    public static void sendKeys() {
    WebElement firstname = driver.findElement(By.id("firstName"));
    firstname.sendKeys("John");
    WebElement lastname = driver.findElement(By.xpath("//*[@id=\"lastName\"]"));
    lastname.sendKeys("Doe");
    WebElement email = driver.findElement(By.xpath("//*[@id=\"email\"]"));
    email.sendKeys("johndoe@gmail.com");
    WebElement jobtitle = driver.findElement(By.xpath("//*[@id=\"jobTitle\"]"));
    jobtitle.sendKeys("Software Engineer");
    WebElement company = driver.findElement(By.xpath("//*[@id=\"company\"]"));
    company.sendKeys("ABCD");
}

错误是

Exception in thread "main" org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="main"]/span/div[2]/div/div/div[1]/div[1]/div/div[1]/div[2]/h3"}

3 个答案:

答案 0 :(得分:0)

在脚本启动之前,只有第一页实际上等待完成加载。如果您从页面导航,则需要手动等待。在没有等待的情况下,脚本将在单击更改页面的链接后立即继续执行下一个命令,并且由于页面尚未加载,因此您将找不到该元素。这给出了错误。

最简单的等待方式是使用" WebDriverWait"

WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id(>someid>)));

这里有更简单的例子: http://toolsqa.com/selenium-webdriver/wait-commands/

答案 1 :(得分:0)

你可以尝试使用这个xpath进行想象,然后等待@chris提到

//div//h3[contains(text(),'Imagine')]

答案 2 :(得分:0)

JavascriptExecutor可用于获取元素的值

参考代码,

confirmText("Imagine", "//*[@id=\"main\"]/span/div[2]/div/div/div[1]/div[1]/div/div[1]/div[2]/h3");

public static void confirmText(String text, String xpath) {
System.out.println("Trying to confirm that given string is equal to the text on page.");
WebElement element = driver.findElement(By.xpath(xpath));
JavascriptExecutor executor = (JavascriptExecutor)driver; 
System.out.println("Test case: " + text);
System.out.println("Result: " + executor.executeScript("return arguments[0].innerHTML;", element););
if (text.equals(executor.executeScript("return arguments[0].innerHTML;", element))) {
    System.out.println("\nEquals.");
}
else {
    System.out.println("\nDoes not equals.");
}
System.out.println("\n\n");}