【问题标题】:How to search for element in dynamic loading grid on scroll using selenium webdriver?如何使用 selenium webdriver 在滚动时搜索动态加载网格中的元素?
【发布时间】:2014-11-04 07:12:40
【问题描述】:

有一个网格,它有 1000 行,其中有一列名为 Username(具有不同的值)。

每个视图只显示 20 行,而其他行将仅在滚动时加载(ajax)。

那么,如何在网格中搜索特定的用户名,因为我们只有在滚动时加载的元素。

Scrollintoview 方法有帮助吗?或者我需要使用window.scrollby() 直到我找到搜索的项目?

【问题讨论】:

标签: java ajax selenium selenium-webdriver


【解决方案1】:

首先,我很抱歉,因为我以前从未在网格上工作过。我认为这将是一个框架,并且会更容易切换,然后使用 JavascriptExecutor 滚动到元素。可惜!网格不是这种情况。
而且,当涉及到网格时,必须有一个表格。

现在,这对我有用。

  • 首先单击网格上的任何可见元素使其成为焦点。
  • 然后使用“Keys.PAGE_DOWN”使用网格的定位器(xpath、id 等)滚动网格,直到找到您要查找的元素。
  • 如果在每个滚动条上都找不到该元素,则处理它引发的异常并再次滚动。
  • 注意:不要忘记在每次滚动后给一些睡眠时间。

    我已经自动化了一个示例网格,并附上了下面的示例工作代码。希望这有助于找出问题:

    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”是一个相对数字。您可以将其更改为要在网格上执行的滚动次数。

    【讨论】:

    • @Vignesh,我已经修复了上面的滚动计数代码。希望这对您有所帮助。
    • 这个答案提供了一些关于如何处理这些场景的见解。 !!
    【解决方案2】:

    我会在任何一天使用“ScrollintoView”。
    它会同时滚动和检查元素,当元素在视图中时停止
    如需代码帮助,请关注this link

    【讨论】:

    • 如何与网格内的滚动条配合使用?
    • 网格必须在框架内。所以,首先你需要使用driver.switchTo().frame(//index or "//name or id of frame" or "Webelement inside frame")切换到框架,然后,你可以使用scrollIntoView方法滚动到元素。
    • 如果它不在 iframe 或表格内怎么办?
    • 请分享网格的 HTML 代码 sn-p 或至少是您尝试自动化网格的网页的链接。到时候就很容易推导出问题了。 :)
    • 我已经编辑了我的问题,我正在寻找一些 poc/ 方法来了解哪种方法最适合这种情况
    猜你喜欢
    • 1970-01-01
    • 2015-04-12
    • 2020-01-15
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    相关资源
    最近更新 更多