我正在使用Selenium WebDriver与Java和ChromeDriver。
我想点击下表所示的单元格,但由于表格溢出且有滚动条,因此无法保证单元格实际位于视图中。
我根据与项目相关的一些参数通过XPath获取单元格。我试过类似下面的内容
String cellXPath = "/html/body/div/div/section/div/div/div[2]/div/div/div/table/tbody/tr[2]/td[2]/div/table/tbody/tr[" + (c.getRow()+2) + "]/td/*[" + (c.getCol()+1) + "]";
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(cellXPath)));
WebElement element = WebDriverUtility.driver.findElement(By.xpath(cellXPath));
System.out.println("CELL: " + element.toString());
jse.executeScript("arguments[0].scrollIntoView(true)", element);
Thread.sleep(500);
element.click();
该元素打印出来并且具有与之关联的xpath。不会发生滚动,也不会发生任何点击。
目前在element.click()行中也出现此错误:
org.openqa.selenium.StaleElementReferenceException: stale element reference: element is not attached to the page document
修改
您可以在此处找到该页面的来源:http://libcal.library.ucsb.edu/rooms.php?i=12405
我在另一个问题中尝试了解决方案,我等待连接元素,或者显式的Thread.sleep,但问题是元素隐藏在表中,因为当页面加载表时会自动向右滚动一定数量。因此,可以找到元素,但不能点击。我需要通过调用滚动到单元格然后触发click事件将元素放回到视图中。希望澄清评论
答案 0 :(得分:0)
使用ExpectedConditions.elementToBeClickable
代替ExpectedConditions.visibilityOfElementLocated
您可以将其拆分为:
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.xpath(cellXPath)));
答案 1 :(得分:0)
您可以在不使用JavaScript Executor的情况下解决您的问题。请找到以下步骤
<强>步骤:强>
工作代码:
//selectRow=Actual Row + 1. Since, first row is displayed for the heading
int selectRow=11;
int selectColumn=40;
WebElement rowElement=driver.findElement(By.xpath("//table[@id='s-lc-rm-scrolltb']/tbody/tr["+selectRow+"]"));
List<WebElement> availableSlotList=rowElement.findElements(By.xpath(".//td/*"));
if(availableSlotList.get(selectColumn).getTagName().equals("a")){
availableSlotList.get(selectColumn).click();
}
else{
System.out.println("Booking Slot is Unavailable/Already Booked");
}
注意:请使用您的逻辑更改selectRow和selectColumn值。例如,selectRow可以修改为c.getRow()。除此之外,您还可以为ArrayIndexOutOfBoundsException案例添加一个条件