Как найти элемент в динамической загрузочной сетке при прокрутке с помощью селена webdriver?

Есть Grid, который имеет 1000 строк с колонкой с именем пользователя (с разными значениями).

И сетка будет отображать только 20 строк на представление, а остальные строки будут загружены(ajax) только при прокрутке.

Итак, как искать конкретное имя пользователя в сетке, так как у нас есть только элементы, загружаемые при прокрутке.

Есть ли Scrollintoview метод помощь? Или мне нужно использовать window.scrollby() пока я не найду искомый предмет?

2 ответа

Решение

Прежде всего, я прошу прощения, потому что я никогда раньше не работал над сеткой. Я думал, что это будет фрейм, и его будет легче переключать, а затем выделять элемент с помощью JavascriptExecutor. Но увы! Это не относится к сетке.
И там должна быть таблица, когда сетка участвует.

Теперь это то, что сработало для меня.

  • Сначала нажмите на любой видимый элемент на сетке, чтобы сфокусировать его.
  • Затем прокрутите сетку, используя локатор сетки (xpath,id и т. Д.), Используя 'Keys.PAGE_DOWN', пока не найдете нужный элемент.
  • Если элемент не найден в каждой прокрутке, обработайте исключение, которое он вызывает, и прокрутите снова.

    Примечание: не забудьте дать время сна после каждой прокрутки.

    Я автоматизировал один пример сетки и прикрепил пример рабочего кода ниже. Надеюсь, что это помогает в решении проблемы:

    import java.io.IOException;
    
    import org.openqa.selenium.By;
    import org.openqa.selenium.JavascriptExecutor;
    import org.openqa.selenium.Keys;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.firefox.FirefoxDriver;
    
    public class ScrollGrid{
    
        public static void main(String[] args) throws IOException, InterruptedException{
    
    
            WebDriver driver = new FirefoxDriver();
            driver.get("https://demos.devexpress.com/ASPxGridViewDemos/PagingAndScrolling/VirtualPaging.aspx");
            driver.manage().window().maximize();
    
            //Clicking on an element inside grid to get it into focus
            driver.findElement(By.xpath("//*[@id='ContentHolder_ASPxGridView1_DXMainTable']//td[.='9/30/1994']")).click();
    
            WebElement ele=null;
            int flag=0;
            int count=0;
    
            do{
                try{
                    //element to search for while scrolling in grid
                    ele = driver.findElement(By.xpath("//*[@id='ContentHolder_ASPxGridView1_DXMainTable']//td[.='3/28/1996']"));
                    flag=1;
                } catch(Throwable e){
                    //scrolling the grid using the grid's xpath
                    driver.findElement(By.xpath("//*[@id='ContentHolder_ASPxGridView1']//div[2]")).sendKeys(Keys.PAGE_DOWN);
                    Thread.sleep(3000);
                }
            }while((flag==0) || ((++count)==250));
    
            if(flag==1){
                System.out.println("Element has been found.!!");
            }else{
                System.out.println("Element has not been found.!!");
            }
    
            highlightElement(driver, ele); //For highlighting the element
            Thread.sleep(5000L); //to check if the element scrolled to is highlighted.
            driver.close();
        }
    
        //For highlighting the element to be located after scroll
        public static void highlightElement(WebDriver driver, WebElement ele) {
            try
            {
                for (int i = 0; i < 3; i++) 
                {
                    JavascriptExecutor js = (JavascriptExecutor) driver;
                    js.executeScript("arguments[0].setAttribute('style', arguments[1]);",ele, "color: red; border: 2px solid red;");
                }
            }
            catch(Throwable t)
            {
                System.err.println("Error came : " +t.getMessage());
            }
        }
    
    }
    

    Примечание: теперь это работает правильно. Он выйдет из цикла в случае, если элемент найден или не найден после 250 прокруток. "250" является относительным числом. Вы можете изменить его на количество свитков, которые вы хотите выполнить в сетке.

  • Я бы взял "ScrollintoView" в любой день.
    Он будет одновременно прокручивать и проверять элемент и останавливаться, когда он будет отображен
    Для помощи с кодом, пожалуйста, перейдите по этой ссылке

    Другие вопросы по тегам