Selenium Scroll ScrollTable到目标元素

时间:2018-05-28 00:45:03

标签: java selenium selenium-webdriver

我正在使用Selenium WebDriver与Java和ChromeDriver。

我想点击下表所示的单元格,但由于表格溢出且有滚动条,因此无法保证单元格实际位于视图中。

enter image description here

我根据与项目相关的一些参数通过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事件将元素放回到视图中。希望澄清评论

2 个答案:

答案 0 :(得分:0)

使用ExpectedConditions.elementToBeClickable代替ExpectedConditions.visibilityOfElementLocated

您可以将其拆分为:

WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.xpath(cellXPath)));

答案 1 :(得分:0)

您可以在不使用JavaScript Executor的情况下解决您的问题。请找到以下步骤

<强>步骤:

  1. 首先选择所需的行
  2. 从匹配的列表中获取所有匹配列子标记的列表 行
  3. 首先获取匹配的属性标记,然后根据匹配的标记执行操作 (因为,我们只能点击可用的插槽,我们是 具有可用/不可用插槽的不同标记)
  4. 工作代码:

        //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案例添加一个条件