xpath被验证但是得到“没有这样的元素:无法找到元素”

时间:2018-03-30 01:48:50

标签: java selenium selenium-webdriver

我试图打开日历并点击月份。我可以设法打开日历,但我的日历的xpath没有被识别。我验证了我的xpath在chrome控制台中工作,但它只能在打开日历后验证它。有人可以帮帮我吗?谢谢!

enter image description here         `

`import java.util.List;
 import java.util.concurrent.TimeUnit;

 import org.openqa.selenium.By;
 import org.openqa.selenium.WebDriver;
 import org.openqa.selenium.WebElement;
 import org.openqa.selenium.chrome.ChromeDriver;
 import org.openqa.selenium.support.ui.ExpectedConditions;
 import org.openqa.selenium.support.ui.WebDriverWait;

 public class CalendarExample {

     public static void main(String[] args) throws InterruptedException {
    // TODO Auto-generated method stub

    System.setProperty("webdriver.chrome.driver","C:\\Program Files\\Java\\Selenium\\Drivers\\chromedriver.exe");
    WebDriver driver = new ChromeDriver();
    driver.manage().window().maximize();
    driver.get("https://www.path2usa.com/travel-companions");

    List<WebElement> dates = driver.findElements(By.className("day"));
    String text = "";


    //select August 22 from calendar
    //step 1: open the calendar
    driver.findElement(By.xpath("//input[@id='travel_date']")).click();

    //step 2: click the month 
    driver.findElement(By.xpath("//body/div[4]/div[@class='datepicker-days']/table//th[@class='datepicker-switch']")).click();
    }
}

3 个答案:

答案 0 :(得分:1)

在selenium中,仅当元素在浏览器中可见时才返回元素对象。另一方面,如果元素不可见,则返回 Selenium.ElementNotVisibleException 。因此,查看您共享的问题,日历元素可能仅在其打开时创建,因此在您尝试单击日历时,您必须确保日历已打开。只有这样,元素才会被返回。

PS:关于你应该使用什么样的XPath的一个建议,请参考:https://stackoverflow.com/a/49497529/1262248

答案 1 :(得分:0)

您遇到错误,因为您尝试在DOM中可用之前访问该元素。 因此,首先打开日历,然后在具有“日”类的访问元素之后。 无需更改xpath

//open calendar
driver.findElement(By.xpath("//input[@id='travel_date']")).click();

//access element with class "day"
List<WebElement> dates = driver.findElements(By.className("day"));

答案 2 :(得分:0)

当您尝试单击该元素时,该元素不可见。

在课程开始时声明:

WebDriverWait wait = new WebDriverWait(driver, 20);

然后,在单击元素之前插入:

wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//body/div[4]/div[@class='datepicker-days']/table//th[@class='datepicker-switch']")));

希望这有帮助。