Selenium Scroll ScrollTable для целевого элемента - PullRequest
0 голосов
/ 28 мая 2018

Я использую 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 голосов
/ 29 мая 2018

Вы можете решить свой сценарий, не используя JavaScript Executor.Найдите следующие шаги

Шаги:

  1. Сначала выберите нужную строку
  2. Получить список всех совпадающих дочерних тегов столбцов изthe matched the row
  3. Сначала получите тег Matched Attribute, а затем выполните действие на основе тега Matched (Так как мы можем щелкнуть только по доступному слоту, и у нас есть другой тег для доступного / недоступногослот)

Рабочий код:

    //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

0 голосов
/ 29 мая 2018

используйте ExpectedConditions.elementToBeClickable вместо ExpectedConditions.visibilityOfElementLocated

, вы можете разделить его на:

WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.xpath(cellXPath)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...