В селене, как нажать на все элементы в длинном списке лениво загруженных элементов? - PullRequest
0 голосов
/ 25 апреля 2018

Что у меня есть - я автоматизирую один веб-сайт, на котором есть большой список элементов, но не загружены все сразу. Скажем, например, у меня есть 200 элементов в списке, но на данный момент загружено только 10 элементов, и из этих 10 только 5 видны на экране.

Что я хочу сделать - Теперь я хочу выбрать все эти элементы 1 на 1, нажимая на них, потому что нажатие на элемент устанавливает флажок перед каждым (В основном я хочу отметить флажок). Поэтому я сначала выберу 5 элементов, которые видны на странице, затем прокручиваю вниз, чтобы выбрать другую видимую группу, так же как и я хочу выбрать все 200 элементов.

С какой проблемой я столкнулся - метод webdriver.findElements (..) возвращает список из 10 загруженных элементов. Но это не возвращение списка в том порядке, в котором элементы отображаются на странице. Я использую цикл for для перебора списка и щелкаю элементы по одному.

В результате, если щелкнуть 6-й элемент, который не отображается на странице, страница прокручивается до этого элемента и щелкает по нему, теперь после этого, если 2-й элемент получил возможность щелкнуть мышью, страница должна прокрутиться вверх, чтобы щелкнуть по нему, но это время, когда DOM снова загрузился из-за прокрутки, я получаю StaleElementReferenceException. Если я обработаю это исключение в try catch и получу список элементов снова, найдя элементы, это не гарантирует, что они будут в правильном порядке и не решит мою проблему.

Решение ?? - Есть ли способ в селене получить список элементов в порядке их отображения на странице? Или, пожалуйста, дайте мне знать, каким должен быть подход для достижения вышеуказанного сценария?

Любые предложения очень ценятся.

Примечание. JAVA используется в качестве языка программирования.

1 Ответ

0 голосов
/ 25 апреля 2018

Если вы также разместите HTML, было бы более полезно объяснить решение. Я пытаюсь дать вам решение, сделав некоторые предположения. Взять пример кода HTML

<div id "checkbox_container>
     <input type="checkbox " id="checkbox1 ">
     <input type="checkbox " id="checkbox1 ">
     <input type="checkbox " id="checkbox1 ">
     <input type="checkbox " id="checkbox1 ">
     .
     .
     .
     <input type="checkbox " id="checkbox1 ">
 </div>

Теперь напишите локаторы, которые дадут count доступных элементов флажка, и локатор, который выберет конкретный флажок.

public class SamplePageObjects {
        //This locator will select all available checkboxes
        public static By ALL_CHECK_BOX = By.xpath("//div[@id='checkbox_container']//input");

        //This locator will select the particular element for the given index
        public static getMeExpectedCheckBox(int index, int maxCount) {
            if (index < 0 || index > maxCount) {
                throw new IlleagalArgumentException(index+" is not a valid index");
            }
            return By.xpath("//div[@id='checkbox_container']//input[" + index + "];
        }
    }

Теперь напишите класс вашей страницы

public class SamplePage{

    //Gives the count of available elements
    public int getCountOfAvailableCheckBox(WebDriver driver){
        return driver.findElements(SamplePageObjects.ALL_CHECK_BOX).size();
    }

    //Selects the specific element
    public void selectWebElement(WebDriver driver,int index){
        driver.findElement(SamplePageObjects.getMeExpectedCheckBox(index).click();
    }

    //Selects all available element one by one
    public void click(){
        int totalCount = getCountOfAvailableCheckBox();
        for(int i=0; i< totalCount-1; i++){
            try{
                selectWebElement(i,totalCount);
            } catch(StaleElementReferenceException e){
                selectWebElement(i,totalCount);
            }
        }
    }

Итак, сначала получите список всех доступных флажков. После получения счетчика просто передайте значение индекса локатору и выполните действие.

Надеюсь, это поможет вам.

...