Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 量角器-铬89-w3c合规性和browser.actions_Javascript_Protractor_Selenium Chromedriver_E2e Testing_W3c - Fatal编程技术网

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
------编辑----

  • 事实证明,我的selenium服务器已经升级,现在传递chrome配置的正确方法是使用
    'goog:chromeOptions'
    而不是
    chromeOptions
    。这样我就可以再次禁用w3c遵从性
  • 同时,将@Sergey Pleshakov答案与其他一些答案相结合,例如,我能够实现从
    browser.actions
    usage切换到plain
    browser.executeScript
    usage的很好效果。@Sergey Pleshakov提出的
    jsClick
    在复选框中效果很好,但在下拉列表中,我需要做更多的工作。 由于我的测试是点击一个大表单,有多个标签,等待选项向下滚动和向上滚动是必要的。最后,我完成了这样的代码:
  • 然而,在Chrome中只需使用
    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);