我有一个用 Polymer 2 构建的网站,它的 DOM 结构看起来像:
...
<df-link slot="local-nav-drawer-link" link-href="/dictionary" text-color="light">
#shadow-root (open)
<a href="/dictionary" title="">
<dom-if style="display: none;">
<template is="dom-if"></template>
</dom-if>
<span class="dfpl-link__text">Dictionary</span>
</a>
</df-link>
...
使用页面对象模式,该模式定义阴影根和我要单击的元素为:
@FindBy(css = "df-link")
public WebElement shadowRootElement;
public By shadowAnchorElementSelector = By.cssSelector("a");
用于检索影子根元素的代码如下所示:
WebElement shadowRoot;
shadowRoot = (WebElement) jsExec.executeScript("return arguments[0].shadowRoot;", shadowRootElement);
WebElement anchor = shadowRoot.findElement(shadowAnchorElementSelector);
anchor.click();
我可以成功获取属性值、css 值和内部文本。但是,当我调用单击时,就会发生这种情况。
Apr 18, 2018 10:25:28 AM org.openqa.selenium.remote.server.WebDriverServlet handle
INFO: Found handler: org.openqa.selenium.remote.server.ServicedSession@136d9af5
Apr 18, 2018 10:25:28 AM org.openqa.selenium.remote.server.WebDriverServlet lambda$handle$0
INFO: Handler thread for session 2525b788dd3471e51e986fed682f04ea (chrome):
Executing POST on /session/2525b788dd3471e51e986fed682f04ea/element/0.23700467091154298-6/click (handler: ServicedSession)
Apr 18, 2018 10:25:28 AM org.openqa.selenium.remote.server.Passthrough handle
INFO: To upstream: {"id":"0.23700467091154298-6"}
Apr 18, 2018 10:25:28 AM org.openqa.selenium.remote.server.Passthrough handle
INFO: To downstream: {"sessionId":"2525b788dd3471e51e986fed682f04ea","status":13,"value":{"message":"unknown error: Cannot read property 'defaultView' of undefinedn (Session info: chrome=66.0.3359.117)n (Driver info: chromedriver=2.38.551601 (edb21f07fc70e9027c746edd3201443e011a61ed),platform=Windows NT 10.0.16299 x86_64)"}}
看起来好像发现该元素很好,我从中读取,但是一旦我调用WebElement.click((,ChromeDriver就会返回错误"无法读取未定义的属性'defaultView'"。我还没有看到这个帖子,我真的很卡住,想知道是否有人对此有答案。
这是Chrome 66和ChromeDriver 2.38。
我刚刚遇到了这个问题,并且能够通过使用火狐和壁虎驱动程序而不是chrome驱动程序来修复它。修复了一切。
尝试使用以下代码
public void forceClickElement(WebElement element){
jsExec.executeScript("arguments[0].click();", element);
}