Javascript 量角器-铬89-w3c合规性和browser.actions
我有一个测试需要点击一个复选框。 如果我简单地执行Javascript 量角器-铬89-w3c合规性和browser.actions,javascript,protractor,selenium-chromedriver,e2e-testing,w3c,Javascript,Protractor,Selenium Chromedriver,E2e Testing,W3c,我有一个测试需要点击一个复选框。 如果我简单地执行$('.my cb')。单击()我得到 元素在点(…)处不可单击。其他元素将收到单击:… 这就是我为什么这么做的原因 browser.actions().mouseMove($('.my-cb')).click().perform() 由于使用了browser.actions,我需要禁用chrome的w3c合规性,因为它在75.X版时开始出现故障。目前,它运行良好 config.capabilities = { browserName: '
$('.my cb')。单击()
我得到
元素在点(…)处不可单击。其他元素将收到单击:…
这就是我为什么这么做的原因
browser.actions().mouseMove($('.my-cb')).click().perform()
由于使用了browser.actions
,我需要禁用chrome的w3c合规性,因为它在75.X版时开始出现故障。目前,它运行良好
config.capabilities = {
browserName: 'chrome',
chromeOptions: {
args: ['--disable-web-security', '--ignore-certificate-errors'],
w3c: false,
},
...
}
现在我已经更新了Chrome75->89。
虽然这在我的本地Windows环境中起作用,但在具有
失败:未知命令:在W3C模式下无法调用非W3C标准命令
因此,实际上我需要的是禁用w3c遵从性(因为上面的配置停止工作)或替换browser.actions()
调用。
我一直在寻找在Chrome89中禁用w3c合规性的其他方法,但没有发现任何有用的方法。只有其他人遇到同样的问题
"@angular/core": "^10.2.4",
"protractor": "~7.0.0",
chromedriver_89.0.4389.23
------编辑----
'goog:chromeOptions'
而不是chromeOptions
。这样我就可以再次禁用w3c遵从性browser.actions
usage切换到plainbrowser.executeScript
usage的很好效果。@Sergey Pleshakov提出的jsClick
在复选框中效果很好,但在下拉列表中,我需要做更多的工作。
由于我的测试是点击一个大表单,有多个标签,等待选项向下滚动和向上滚动是必要的。最后,我完成了这样的代码:browser.actions().mouseMove($('.cls')).click().perform()
就可以了,这样做太复杂了,这是非常令人伤心的。我真的不明白为什么这个API没有移植到其他浏览器
非常感谢您花费的时间。您的问题是因为在元素的顶部有一个包装元素。它甚至可以是隐形的。但量角器不能点击它。您可以做的是点击顶部声明js(在控制台中插入脚本)。然后直接单击任意元素。这个
jsClick
不关心您正在单击的元素的交互性和可见性
let jsClick = ($element) => browser.executeScript(
"arguments[0].click();",
$element.getWebElement()
);
let $option = $("option[value='395']");
await jsClick($option);
谢谢你的回答。它确实对复选框有效。然而,当使用这个下拉列表时,另一个问题出现了——随机地,一些下拉列表没有及时扩展,并且它们的选项也找不到
NoSuchElementError:by.cssContainingText(“mat option.mat option text”,“Yes”)使用定位器时未找到元素。
我尝试使用此代码,但结果相同。这应该在另一个问题中单独提出。如果有帮助,请投票并接受
export const jsClick = $element =>
browser.executeScript('return arguments[0].click();', $element.getWebElement())
export const jsMove = async $element => {
await browser.executeScript(
`if(document.createEvent) {
var evObj = document.createEvent('MouseEvents');
evObj.initEvent('mouseover', true, false);
arguments[0].dispatchEvent(evObj);
} else if (document.createEventObject) {
arguments[0].fireEvent('onmouseover');
}`,
$element.getWebElement()
)
return browser.sleep(1000)
}
export const scrollIntoView = function(el) {
return browser.executeScript(function(el) {
el.scrollIntoView()
}, el.getWebElement())
}
await scrollIntoView(input)
await jsMove(input)
await browser.wait(until.elementToBeClickable(input), 5000, WAITING_TOO_LONG_FOR_ELEMENT)
await input.click()
const optionByCss = by.cssContainingText('mat-option .mat-option-text', value);
await browser.wait(until.visibilityOf(element(optionByCss)), 5000, WAITING_TOO_LONG_FOR_ELEMENT)
const option = await element(optionByCss)
await jsMove(option)
await option.click()
await browser.wait(until.invisibilityOf(element(optionByCss)), 5000, WAITING_TOO_LONG_FOR_ELEMENT)
let jsClick = ($element) => browser.executeScript(
"arguments[0].click();",
$element.getWebElement()
);
let $option = $("option[value='395']");
await jsClick($option);