selenium.JavascriptException:JavaScript错误:无法在“文档”上执行“ elementFromPoint”:提供的双精度值是非限定的

时间:2019-11-22 15:56:05

标签: selenium-chromedriver selenium-remotedriver

使用chrome 78和chromedriver78 当我单击音频文件或尝试使用硒测试停止音频时,出现此错误。

错误:

  

org.openqa.selenium.JavascriptException:JavaScript错误:无法在“文档”上执行“ elementsFromPoint”:提供的双精度值是非限定的。

请注意,它仅在远程Webdriver上发生,并且不一致。

详细信息在这里:

当“ [item_1]”元素的音频播放器在“ [data-rcfid ='checkbox_7']”中停止播放时

  

org.openqa.selenium.JavascriptException:JavaScript错误:无法在“文档”上执行“ elementsFromPoint”:提供的双精度值是非限定的。     (会议信息:chrome = 78.0.3904.70)   内部版本信息:版本:'3.11.0',版本:'e59cfb3',时间:'2018-03-11T20:26:55.152Z'   系统信息:主机:'ip-10-0-10-137',ip:'10 .0.10.137',操作系统名称:'Linux',os.arch:'amd64',os.version:'4.4.0- 71-generic',java.version:'1.8.0_111'   驱动程序信息:org.openqa.selenium.remote.RemoteWebDriver   功能{acceptInsecureCerts:true,browserName:chrome,browserVersion:78.0.3904.70,chrome:{chromedriverVersion:78.0.3904.70(edb9c9f3de024 ...,userDataDir:C:\ Windows \ proxy \ scoped_dir ...},goog:chromeOptions:{ debuggerAddress:本地主机:1674},javascriptEnabled:true,networkConnectionEnabled:false,pageLoadStrategy:正常,平台:XP,platformName:XP,代理服务器:Proxy(),setWindowRect:true,strictFileInteractability:false,超时:{隐式:0,pageLoad: 300000,脚本:30000},unhandledPromptBehavior:accept,webdriver.remote.sessionid:eb7d4195af3426c181317a16028 ...}   会话ID:eb7d4195af3426c181317a160286b15e0125b619       在sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)处       在sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)       在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)       在java.lang.reflect.Constructor.newInstance(Constructor.java:423)       在org.openqa.selenium.remote.http.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:187)       在org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:122)       在org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:49)       在org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158)       在org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:545)       在org.openqa.selenium.remote.RemoteWebDriver.perform(RemoteWebDriver.java:611)       在org.openqa.selenium.interactions.Actions $ BuiltAction.perform(Actions.java:638)       在webDriver.Driver.click(Driver.java:147)       在pageObjects.ActivityPageObject.clickAudioInlineStopIn(ActivityPageObject.java:205)       在stepDefinition.Activity.theAudioPlayerOfTheElementIsStoppedIn(Activity.java:61)       当在[[data-rcfid ='checkbox_7']“中停止“ item_1”元素的音频播放器时(/ opt / atlassian / bamboo-home / xml-data / build-dir / 16744451 / RCF1-RMIT -BROW3 / rcf-automation-tests / src / test / resources / featureFiles / interactions / markedInteractions / CheckBox.feature:433)

7 个答案:

答案 0 :(得分:5)

我遇到了同样的问题,观察到的是,同一xpath包含多个元素。找到不同的唯一xpath可以解决

答案 1 :(得分:3)

我也遇到了同样的问题,只需将窗口向下滚动到我要定位的元素就可以解决该问题。似乎该元素未在视口中显示,这就是为什么硒不可见该元素的原因。

在找到并单击元素之前,尝试添加以下行:

driver.execute_script("window.scrollTo(0, window.scrollY + 100)")
driver.implicitly_wait(3) 

答案 2 :(得分:0)

在尝试单击AngularJS网格中的单元格时遇到了同样的问题。我确认我的XPath查询仅导致一个结果,然后研究了添加等待条件是否有帮助。事实证明,在此处添加“等待”可以使代码继续运行而不会出错。

下面的代码是我用来单击单元格的方法。当Click()方法被另一个元素拦截时,我从Click()切换为Action。

public void ClickEmploymentChangeLogButton()
{
    Wait.Until(WaitConditions.ElementIsVisibleAndEnabled(EmploymentChangeLogButton));
    Actions actions = new Actions(driver);
    actions.MoveToElement(EmploymentChangeLogButton).Perform();
    actions.MoveToElement(EmploymentChangeLogButton).Click().Perform();
}

WaitConditions是一个单独的类,用于对不赞成使用的ExpectedConditions包的某些行为进行建模。

这是上面使用的WaitConditions内部的方法。

public static Func<IWebDriver, bool> ElementIsVisibleAndEnabled(IWebElement element)
{
    return (driver) =>
    {
        try
        {
            return element.Displayed && element.Enabled;
        }
        catch (Exception)
        {
            // If element is null, stale or if it cannot be located
            return false;
        }
    };
}

答案 3 :(得分:0)

问题是,您发现Web浏览器中未以图形方式显示的元素-location属性的值为:X = 0和Y = 0;因此您可能找到了错误的元素。

答案 4 :(得分:0)

这个错误信息...

Javascript error: Failed to execute 'elementsFromPoint' on 'Document': The provided double value is non-finite

...暗示 WebDriver 实例无法使用 Locator Strategy 找到所需元素,原因之一或其他:

  • 定位器策略不会在 DOM Tree 中唯一标识所需元素。
  • 当您尝试与其交互时,该元素未正确加载。
  • 元素位于 <iframe> / <frame>
  • 元素的style属性包含display: none;
  • 元素位于 shadow DOM 中。

分析

相关的 HTML 将有助于以更好的方式分析问题。但是,您需要注意以下几点:

  • 确保定位器策略HTML DOM 中唯一标识所需元素。

  • elementToBeClickable() 引入 WebDriverWait,您可以使用以下任一 Locator Strategies

    • cssSelector

      new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("elementCssSelector"))).click();
      
    • xpath

      new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("elementXpath"))).click();
      
  • 如果 WebElement<iframe> / <frame> 内,您需要为所需的 frameToBeAvailableAndSwitchToIt() 引入 WebDriverWait

<块引用>

您可以在Is it possible to switch to an element in a frame without using driver.switchTo().frame(“frameName”) in Selenium Webdriver Java?

中找到相关的详细讨论

参考文献

您可以在以下位置找到一些相关的详细讨论:

答案 5 :(得分:0)

我也遇到了同样的问题。就我而言,问题是我尝试移动到的元素在浏览器中尚不可见。

所以我使用了 time.sleep(1)

在那之后它起作用了。

答案 6 :(得分:0)

当我从 70 年代 (71?) 的版本升级到 ChromeDriver 88 时出现此错误。它实际上是由早期版本的解决方法引起的。这是使用角度下拉菜单。我必须移动到该元素,然后在单独的步骤中单击它,而不是单击一个元素。当我删除 moveToElement 步骤时,错误消失了

之前的代码

        masterPage.MasterDropDown.click();
        Thread.sleep(3000);
        actions.moveToElement(masterPage.MasterDropDown).perform();
        Thread.sleep(1000);
        actions.moveToElement(masterPage.DropdownButton1).perform();
        Thread.sleep(1000);
        masterPage.DropdownButton1.click();

改为

        masterPage.MasterDropDown.click();
        masterPage.DropdownButton1.click();

错误消失了,更干净了。