2

这是 HTML: https ://www.dropbox.com/s/aiaw2u4j7dkmui2/Untitled%20picture.png

我不明白为什么这段代码在页面上找不到元素。该网站不使用 iframe。

@Test
public void Appointments() {
    driver.findElement(By.id("ctl00_Header1_liAppointmentDiary"));
}

这是我收到的错误消息:

FAILED: Appointments
org.openqa.selenium.NoSuchElementException: Unable to locate element: {"method":"id","selector":"ctl00_Header1_liAppointmentDiary"}
4

5 回答 5

11

这是时间问题吗?元素(或整个页面)是否加载了 AJAX?当您尝试查找它时,它可能不存在于页面上,WebDriver 通常“太快”。

要解决它,要么是隐式的,要么是显式的 wait

隐式等待方式。由于隐式等待集,如果元素没有立即出现(这是异步请求的情况),这将尝试等待元素出现在页面上,直到它超时并照常抛出:

// Sooner, usually right after your driver instance is created.
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

// Your method, unchanged.
@Test
public void Appointments() {
    ...
    driver.findElement(By.id("ctl00_Header1_liAppointmentDiary")).doSomethingWithIt();
    ...
}

显式等待方式。这只会在寻找它时等待这个元素出现在页面上。使用ExpectedConditions该类,您也可以等待不同的事情 - 元素可见、可点击等:

import static org.openqa.selenium.support.ui.ExpectedConditions.*;

@Test
public void Appointments() {
    ...
    WebDriverWait wait = new WebDriverWait(driver, 10);
    wait.until(presenceOfElementLocated(By.id("ctl00_Header1_liAppointmentDiary")))
        .doSomethingwithIt();
    ...
}
于 2013-07-26T08:43:17.580 回答
2

您正在寻找ctl00_Header1_liAppointmentDiary,但只有Header1_liAppointmentDiary,那些不一样...

ctl00_Header1_liAppointmentDiary != Header1_liAppointmentDiary
于 2013-07-25T09:03:15.440 回答
2

id="ctl00_Header1_liAppointmentDiary"您的html中没有元素

driver.findElement(By.id("ctl00_Header1_liAppointmentDiary"));

应该

driver.findElement(By.id("Header1_liAppointmentDiary"));
于 2013-07-25T09:06:08.930 回答
0

查看代码,我认为您尝试单击的链接位于下拉菜单下,或者您需要将鼠标悬停在某些内容上才能看到此链接。如果是这样,那么您将必须使元素可见以执行操作。

于 2013-07-25T16:51:45.890 回答
0

尝试 driver.findElement(By.ClassName("MyAppointments"));

如果 webdriver 无法通过 xpath 或 id 找到元素,通常最好尝试所有可行的 By 选项

http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/By.html

于 2013-07-25T15:49:41.680 回答