量角器:向下滚动

Posted

技术标签:

【中文标题】量角器:向下滚动【英文标题】:Protractor: Scroll down 【发布时间】:2014-06-27 14:54:13 【问题描述】:

我的页面上有一个按钮,当用户向下滚动时该按钮可见。因此,量角器测试给我一个错误:

UnknownError:未知错误:元素在点 (94, 188) 处不可点击。

我尝试使用:

browser.executeScript('window.scrollTo(0,document.body.scrollHeight)');

当我在量角器 elementexplorer.js 中测试它时它起作用了,但在我的常规测试中它什么也没做。有没有其他办法解决这个问题?

【问题讨论】:

【参考方案1】:

您需要等待承诺得到解决。以下示例来自open issue

browser.executeScript('window.scrollTo(0,0);').then(function () 
    page.saveButton.click();
)

更新: 这是一个老问题(2014 年 5 月),但它仍然吸引了一些访问者。 澄清一下:window.scrollTo(0, 0) 滚动到当前页面的左上角。

如果你想滚动到页面底部,你可以调用

window.scrollTo(0, document.body.scrollHeight)

正如@jsuser 在this answer 中提到的那样

更现代的方法是使用

browser.actions().mouseMove(element).perform();

在this answer@MartinBlaustein 上投票

【讨论】:

我遇到了同样的问题,上面的代码在 Firefox 中有效,但在 chrome 中无效。任何帮助表示赞赏??? @EnugulaS 试试browser.executeScript('arguments[0].click()', yourWebElem); 我是疯子还是页面左上角的0,0?我相信如果你想向下滚动,你需要将 y 参数调整为 >0。 正确(而不是疯狂)。看一看:w3schools.com/jsref/met_win_scrollto.asp【参考方案2】:

我想补充上一个答案,希望能提供更多解释。

这段代码,在“executeScript”的调用中:

'window.scrollTo(0,0);'
向上滚动窗口,到窗口坐标 0,0...基本上到最顶部 如果您知道需要前往的具体区域,只需更改坐标即可。

如果你知道你想在窗口的最底部,这是我的目标。您可以在 'y' 坐标中放置一个非常大的数字,就像我在这里所做的那样:

browser.executeScript('window.scrollTo(0,10000);').then(function () 
    expect(<some control>.<some state>).toBe(<some outcome>);
)

【讨论】:

【参考方案3】:

如果其他人遇到像我一样的麻烦:

我试图滚动到页面底部以在无限滚动场景中加载我的下一组数据。我尝试了 window.scrollTo 的不同变体以及 arguments[0].click() 都没有成功。

最后我意识到,要让页面滚动,我必须通过单击窗口中的任何元素来将焦点放在“窗口”上。然后 window.scrollTo(0, document.body.scrollHeight) 工作就像一个魅力!

示例代码:

element(by.className('<any element on page>')).click();
browser.executeScript('window.scrollTo(0,document.body.scrollHeight)').then(function()
//whatever you need to check for here
);

【讨论】:

【参考方案4】:

我发现创建一个 util helper 并在页面对象(或测试文件本身)中使用它会有所帮助。这似乎对我很有效:

utils.js

module.exports = 
  scrollIntoView: function(el) 
    browser.executeScript(function(el) 
      el.scrollIntoView();
    , el.getWebElement());
  

在某处的页面对象内...

var scrollIntoView = require('../utils').scrollIntoView;

module.exports = 
  clickBackBtn: function() 
    var el = element(by.buttonText('Go back'));
    scrollIntoView(el);
    el.click();
    return;
  

在测试本身...

it('should allow the user to go back to the profile page', function() 
  PageObject.clickBackBtn();
  expect(browser.getCurrentUrl()).toContain('/user/profile');
);

【讨论】:

【参考方案5】:

我找到了一个更简单的方法。如果你想滚动到一个元素,你可以使用

    browser.actions().mouseMove(element).perform();

之后浏览器将聚焦该元素。

【讨论】:

我喜欢这种方法,谢谢!我一直使用 scrollTo() 选项,但是当我不得不在模态对话框的 slimScroll 上执行此操作时,滚动会影响背景,而不是模态中的焦点 slimScroll。如果屏幕布局发生变化,我也不再需要在测试中更改 Y 位置。 :) :) 很高兴它有帮助 我也更喜欢这种方法,但它被 chrome protractortest.org/#/… 破坏了【参考方案6】:

这个问题的答案在顶部被标记为正确。但是在升级最新的chrome v54之后。下面的代码可能是最好的解决方案。

browser.actions().mouseMove(element).perform();

【讨论】:

这几乎只是this existing answer的重复。 @Pang 但制表符不同?【参考方案7】:

其他方式,你可以试试这个:

this.setScrollPage = function (element) 

    function execScroll() 
        return browser.executeScript('arguments[0].scrollIntoView()',
            element.getWebElement())
    

    browser.wait(execScroll, 5000);

;

【讨论】:

【参考方案8】:

如果您只想导航到长页面的顶部或底部,您可以简单地使用“HOME”键转到顶部,或使用“END”键转到底部。

例如:

browser.actions().sendKeys(protractor.Key.HOME).perform();

browser.actions().sendKeys(protractor.Key.END).perform();

【讨论】:

【参考方案9】:

最简单的方法是滚动到预期的元素并单击它。请在当前量角器版本中使用以下经过测试和验证的代码。

it('scroll to element', function() 
           browser.driver.get('https://www.seleniumeasy.com/');
            var btnSubscribe= element(by.id('mc-embedded-subscribe'));
            browser.executeScript("arguments[0].scrollIntoView();", btnSubscribe);
             browser.sleep(7500);
             btnSubscribe.click();
          );

【讨论】:

【参考方案10】:

使用

await browser.executeScript(`arguments[0].scrollIntoView(block: "center");`, $element.getWebElement());

如果你想让元素滚动到窗口的中心

【讨论】:

【参考方案11】:

我已经遵循了上述所有方法,可以得出以下结论:3 件事肯定有效:

// if you want to move on top of the browser page
browser.actions().sendKeys(protractor.Key.HOME).perform();

// if you want to move on Bottom of the browser page
browser.actions().sendKeys(protractor.Key.END).perform();

如果滚动功能是在浏览器内部而不是在整个页面上实现的,那么请确保单击网格上要滚动的任意位置,然后使用上面的代码。

//Please for other methods to scroll can check "https://www.guru99.com/scroll-up-down-selenium-webdriver.html"
// Best way I would suggest is to use this way as here Element means the XPath 
let Element = element(by.xpath(optionid));
await browser.executeScript("arguments[0].scrollIntoView();", Element.getWebElement());

【讨论】:

以上是关于量角器:向下滚动的主要内容,如果未能解决你的问题,请参考以下文章

量角器:从标准角度GRID中获取数据,在向左或向右滚动时重绘

滚动到量角器中的第一个ng-repeat元素,然后单击

量角器 - 其他元素将收到点击

UIScrollView 应该只向下滚动

使用 jQuery 在向上滚动和向下滚动时添加不同的 CSS 动画

滚动按钮 jQuery 用于向上滚动和向下滚动