【问题标题】:WebElement getText() is an empty string in Firefox if element is not physically visible on the screen如果元素在屏幕上不可见,则 WebElement getText() 是 Firefox 中的空字符串
【发布时间】:2013-03-02 04:01:00
【问题描述】:

在将 Firefox 升级到版本 19 后,我的 Selenium Webdriver 测试最近中断了。在我的几个测试中,我需要检索页面上但在浏览器窗口中不可见的元素,即我必须向右滚动才能看到它们。自从升级到 Firefox 19(我从 15 升级,所以这可能是自 16 以来的问题)我只能检索我可以在浏览器窗口上看到的元素的文本。我的 xpaths 正确检索所有元素,例如在我的以下代码中:

    private void buildColumnsMap(){
    allColumnHeaders = new HashMap<String,Integer>();
    positionToColumnName = new ArrayList<String>();

    WebElement columnsRoot = driver.findElement(By.xpath(COLUMNS_ROOT_XPATH));
    List <WebElement> columns = columnsRoot.findElements(By.xpath("./td/div/span"));
    System.out.println("Number of columns found: " + columns.size());

    for(int i = 0; i < columns.size(); ++i){
        String columnName = columns.get(i).getText();
        System.out.println("Column been inserted: " + columnName);
        allColumnHeaders.put(columnName, i);
        positionToColumnName.add(columnName);
    }
}

列表“列”的大小为 38,但在我的浏览器窗口中,我只能看到 10 列而无需滚动,因此当我将列名放入对象时,我得到 10 个列名,然后全部为空白。

Number of columns found: 38
Column been inserted: Date/Time
Column been inserted: Endpoint1
Column been inserted: Endpoint2
Column been inserted: Duration
Column been inserted: Codec1
Column been inserted: Codec2
Column been inserted: Avg MOS1
Column been inserted: Avg MOS2
Column been inserted: Avg Latency1 (ms)
Column been inserted: Avg Latency2 (ms)
Column been inserted: Avg Jitter1 (ms)
Column been inserted: 
Column been inserted: 
...
...

这在 Firefox 15 中对我来说非常好用,但现在已经坏了。有没有人遇到过类似的事情并找到了解决方法?或者有没有办法“滚动到一个元素”以强制滚动并使其在屏幕上可见?

【问题讨论】:

    标签: firefox selenium webdriver selenium-webdriver


    【解决方案1】:

    通过禁用下面的原生事件来尝试同样的事情

    FirefoxProfile profile=new FirefoxProfile();
    profile.setEnableNativeEvents(false);
    DesiredCapabilities dc = DesiredCapabilities.firefox(); 
    dc.setCapability(FirefoxDriver.PROFILE, profile); 
    driver = new FirefoxDriver(dc);
    

    这是一些解决页面向下问题的方法

    driver.findElement(By.tagName("body")).sendKeys(Keys.PAGE_DOWN);
    

    你升级到 selenium-server-standalone-2.31.0 了吗?

    【讨论】:

    • 是的,我今天也升级到了 2.31.0,但我确定问题出在浏览器上。带有 selenium 2.28 - 2.31 的 Firefox 15 工作正常,带有任何库的 Firefox v16+ 都不起作用。我会试一试个人资料,希望它会起作用。
    • 我实际上需要向右滚动而不是向下滚动,我尝试了一些 JavaScript 选项,但我认为它们效果不佳。
    • 然后尝试使用 sendKeys(Keys.RIGHT)
    【解决方案2】:

    我找不到 WebDriver 和/或 Firefox 的行为方式为何如此的答案。在我的 AUT 中,我有一个显示报告的网格以及我能够在 Html 中看到的屏幕上不可见的任何单元格/WebElement,它们似乎没有被隐藏,WebDriver 会承认它可以看到它们但是我无法检索任何元素的值,即 getText、getAttribute 等。所以为了解决这个限制(不确定它是错误还是它的行为方式),我使用了以下一点点 JavaScript,它似乎已经解决了我的问题:

    private void scrollToElement(WebElement element){
    
    ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
    }
    

    这绝对是 Firefox 从 v16+ 开始的行为变化。希望其他人也能发现这很有帮助。

    【讨论】:

    • 不知道我可以用 Javascript 传递 DOMElements。这让事情变得容易多了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    相关资源
    最近更新 更多