您好我在进行基本量角器测试时遇到了一些麻烦。
我的设置:
量角器conf.json:
"use strict";
exports.config = {
specs: '../E2ETests/**/*.js',
chromeOnly: true,
getPageTimeout: 30000,
allScriptsTimeout: 30000
}
测试:
"use strict";
describe('When clicking should add stuff', function () {
var ptor;
beforeEach(function () {
browser.get('https://localhost/myApp');
ptor = protractor.getInstance();
});
it('add stuff', function () {
// If I comment this, the test pass.
element(by.id('add-stuff-button')).click();
// This does not matter fails on the line above..
expect(browser.getTitle()).toBeDefined();
});
});
错误:
UnknownError: unknown error: Element is not clickable at point (720, 881). Other element would receive the click: <div class="col-md-5 col-md-offset-5">...</div>
(Session info: chrome=37.0.2062.124)
(Driver info: chromedriver=2.10.267521,platform=Windows NT 6.1 SP1 x86_64)
思想
chromedriver确实找到了按钮,因为如果我更改了id,它会抱怨没有找到任何元素。所以我认为问题是按钮从初始位置移开。由于元素(***)函数应该等待角度完成,我怀疑它可能会干扰它的第三方插件,因为它们可能不会使用角度api的获取数据等。所以有角度认为它完成但是然后第三方插件填充和移动周围的东西。
任何想法该怎么办? 如果第三方插件是问题所在,我能以某种方式告诉角度第三方的东西正在进行,然后告诉它何时完成?
THX BR TWD
答案 0 :(得分:27)
您应该在配置文件中设置窗口大小
onPrepare: function() {
browser.manage().window().setSize(1600, 1000);
}
答案 1 :(得分:19)
以下为我工作正常:
browser.actions().mouseMove(element).click();
编辑:如果上面不起作用,请尝试链接perform()方法(我将此作为编辑建议,我没有测试过,但有人可以验证并评论)
browser.actions().mouseMove(element).click().perform();
答案 2 :(得分:12)
如果chrome窗口太小,会发生这种情况,尝试在beforeEach
内添加browser.driver.manage().window().setSize(1280, 1024);
答案 3 :(得分:11)
或者只使用Actions类:
browser.actions().mouseMove(elem).click().perform();
答案 4 :(得分:4)
也许它不适用于您的情况,但我遇到了同样的问题,根据package_data
or data_files
的答案,我一直在寻找另一个遮住按钮的元素(在我的情况下,我的屏幕右上角的下拉菜单。)
它似乎是由 Gulp 启动的 browsersync 发送的已连接到浏览器同步通知消息。消息在短时间后消失,但在我的onClick()调用之后消失。
要删除通知,在我的gulpfile中,我在初始化browsersync时添加了notify:false参数:
browserSync.init(files, {
server: {
baseDir: "dist",
index: "index.html"
},
notify: false
});
答案 5 :(得分:4)
有同样的问题,但与窗口大小无关,但必须等待ngAnimation结束。
所以我不得不等到元素可以点击。
ProtractorExpectedConditions
@note - 我正在使用async / await node 8功能,您也可以将其转换为常规Promises。
同时使用ExpectedConditions
代替using Autofac.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
see documentation
答案 6 :(得分:3)
我通过使用浏览器时间睡眠解决了这个问题。
browser.driver.sleep(3000)
在给出点击按钮之前
答案 7 :(得分:2)
我有同样的错误,纯粹调整屏幕尺寸并没有为我解决。
进一步检查后,看起来好像另一个元素遮挡了按钮,因此Selenium测试失败,因为按钮没有(并且无法点击)。也许这就是为什么调整屏幕大小会为某些人修复它?
固定的矿井正在移除另一个元素(后来调整它的位置)。
答案 8 :(得分:1)
其他方式,你可以试试这个:
this.setScrollPage = function (element) {
function execScroll() {
return browser.executeScript('arguments[0].scrollIntoView()',
element.getWebElement())
}
browser.wait(execScroll, 5000);
element.click();
};
答案 9 :(得分:1)
这比指定窗口大小更好,以防您测试需要在多个显示器上运行。
browser.manage().window().maximize();
答案 10 :(得分:1)
这意味着该元素不在可见区域内。有几种方法可以解决这个问题:
await browser.executeScript('arguments[0].click();', $element.getWebElement());
await browser.executeScript(`arguments[0].scrollIntoView({block: "center"});`, $element.getWebElement());
await $element.click()
beforeAll(async () => await browser.driver
.manage()
.window()
.setSize(1920, 1080)
);
答案 11 :(得分:0)
您也可以尝试关闭可能正在使用的任何调试工具。我使用的是Laravel和debugbar,并且必须将APP_DEBUG设置为false。
答案 12 :(得分:0)
来自Gal Malgarit的答案,
您应该在配置文件中设置窗口大小
onPrepare: function() {
browser.manage().window().setSize(1600, 800);
}
如果它仍然不起作用,您应该滚动到元素的位置
browser.executeScript('window.scrollTo(720, 881);');
element(by.id('add-stuff-button')).click();
答案 13 :(得分:0)
请注意,这有时会由顶部导航栏或底部导航栏/ Cookie警告栏覆盖该元素。对于角度2,当点击它时滚动直到元素仅在页面上。这意味着当向下滚动以点击某些内容时,如果存在底部导航,则会阻碍点击。同样,向上滚动时,顶部导航可以覆盖它。
现在,为了绕过滚动,我使用以下内容:
sapply(ls()[grepl("list",sapply(ls(), function(z) class(get(z))))],
function(z) format(object.size(get(z)), units = "Mb") )
我确保在测试开始之前通过单击关闭它来移除底部栏。
答案 14 :(得分:0)
您可以通过量角器配置文件(例如protractor.conf.js
或config.js
)定义所需的屏幕分辨率,以实现一致的测试行为。
exports.config = {
specs: [
// ...
],
capabilities: {
browserName: 'chrome',
chromeOptions: {
args: [
'--window-size=1600,900',
'--headless'
]
}
}
// ...
}
window-size
参数将以1600 x 900的窗口启动Chrome。headless
将启动无头Chrome,即使屏幕分辨率低于此值,您也可以在指定的窗口大小(1600 x 900)下运行测试。您可能需要两种配置,一种用于始终具有高分辨率屏幕的开发人员(无头模式),另一种用于构建服务器(无头模式),其中屏幕分辨率有时是一个谜,有时可能低于您的应用程序/测试是为。量角器配置文件是javascript,可以扩展以避免代码重复。