这是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"}
答案 0 :(得分:8)
这是时间问题吗? AJAX加载的元素(或整个页面)是?当你试图寻找它时,页面上可能没有它,WebDriver通常“太快”。
要解决它,可以是implicit or explicit 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();
...
}
答案 1 :(得分:2)
您正在搜索ctl00_Header1_liAppointmentDiary
,但只有Header1_liAppointmentDiary
,这些不一样......
ctl00_Header1_liAppointmentDiary != Header1_liAppointmentDiary
答案 2 :(得分:2)
html中没有id="ctl00_Header1_liAppointmentDiary"
的元素
driver.findElement(By.id("ctl00_Header1_liAppointmentDiary"));
应该是
driver.findElement(By.id("Header1_liAppointmentDiary"));
答案 3 :(得分:0)
试
driver.findElement(By.ClassName("MyAppointments"));
如果webdriver无法通过xpath或id找到元素,那么尝试所有可以使用的By选项通常是个好主意
http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/By.html
答案 4 :(得分:-1)
查看代码我认为您尝试单击的链接是在下拉列表中,或者您需要将鼠标悬停在某些内容上才能看到此链接。如果是这样,那么您将使元素可见以执行操作。