- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图点击页面上的一个元素;该元素在屏幕上清晰可见。有一个 toastr 可能会弹出,所以我试图写一个防御:如果 toastr 在屏幕上,先关闭 toastr ,然后继续点击进入下一页。我正在使用 PageFactory,因此我有一个元素包含 toastr ,一个元素用于 toastr 的关闭按钮。我的“处理 toastr ”方法如下:
if (driver.findElements(By.cssSelector("#toaster")).size() > 0
&& toaster.isDisplayed()) {
toasterClose.click();
}
但是,当我在 chrome 中执行此操作时,我得到了 org.openqa.selenium.WebDriverException: unknown error: Element is not clickable at point (994, 758)
暂停测试执行,我在屏幕上看不到 toastr 。我认为开发人员必须通过将其呈现在一个遥远的、不可滚动的位置来隐藏它。所以权宜之计,我加了一个条件,如果x坐标大于800,就不要点击。有了它,我得到:
org.openqa.selenium.WebDriverException: unknown error: Element is not clickable at point (547, 725). Other element would receive the click: <div id="toaster">...</div>
这是怎么回事? toastr 怎么可能无法点击但无论如何都会以某种方式收到点击? Firefox 可以很好地处理测试,有或没有 800 像素的解决方法;只有 Chrome 有这个问题。
澄清一下:测试的目的不是点击 toastr 。目标是单击页面上的另一个元素。测试报告 toastr 挡住了路,所以我尝试编写一个步骤来关闭 toastr (如果显示)。我没有见过这个 toastr ,所以我不确定它是什么,但 chrome 一直报告说它挡住了路。我们网站上所有的 toastr 都使用一个基本模板,其中包含一个关闭按钮,以便用户可以关闭 toastr ,这正是我要点击的按钮。 Firefox 从来没有这个问题,也不报告任何 toastr 的存在。
我称它为 toastr 是因为我们的网站就是这样调用它的,因为无论我们从哪个框架(jQuery UI?Backbone?)中获取它,它都是这样称呼的。如果我暂停执行,此时我在测试中看不到任何 toastr ,但 jQuery 告诉我它存在并且可见。但是,使用 jQuery 找到的元素只有我们的 toastr 设置的默认部分:一个 div、一个应该放置消息的空 div 和关闭按钮。显然此时不打算渲染它,但 Chrome 认为它挡住了路。
最佳答案
我假设“ toastr ”是指某种带有关闭按钮的 javascript 模式弹出窗口。
确定正确的问题
您正在测试 #toaster
元素的存在和可见性,而不是您正在单击的 toasterClose
元素。不能保证仅仅因为一个元素存在并显示,另一个元素也存在。从错误来看,#toaster
元素似乎与 toasterClose
元素重叠,使其无法点击。
可点击性问题排查
正确选择 toasterClose
后,手动使用 devtools 并检查它无法点击的原因。它是否可见且畅通无阻? toasterClose
元素的高度/宽度是否为零?是否有动态 JavaScript 修改页面后加载?它实际上位于页面 View 中吗? (我的元素在窗口边缘呈现得非常明显,只是被浏览器的滚动条挡住了。1)
备选方案
您还应该查看是否真的需要使用此 toasterClose
元素。人类将如何关闭此弹出窗口?他们会按Escape
吗?他们会点击弹出窗口外的覆盖元素吗?他们是否做了其他事情来触发某种 closeModal()
javascript 函数?您还可以使用 Selenium 执行上述任何操作。
不得已
要删除此类弹出窗口,您总是可以做的一件事是运行您自己的 javascript 来修改 DOM 并完全删除有问题的元素:
driver.execute_script(<<-javascript)
var toaster = document.getElementById("toaster");
toaster.parentNode.removeChild(toaster);
var overlay = document.getElementById("modal_overlay");
overlay.parentNode.removeChild(overlay);
javascript
future /额外
如果这对您来说是一个常见问题,我建议将此代码包装在 try/catches 和重试机制中,以使其能够适应 javascript 动态加载的元素。
1 更新
只是详细说明我遇到的滚动条问题,因为事实证明这与您的问题非常相似。
在这里,“手气不错”按钮不可见。如果 Selenium 试图点击它,首先它会尝试将它滚动到 View 中。
这是 Selenium 将尝试执行的操作的示例。请注意按钮现在是如何“在 View 中”的。
但是,OSX 上的 Chrome 的样式通常会隐藏滚动条。 Selenium 发出滚动命令的那一刻,滚动条出现,下面的点击命令无法到达按钮。
解决方案是使用 javascript 手动滚动窗口:
page.execute_script(<<-javascript)
document.getElementById("gbqfsb").scrollIntoView(true);
// or if that doesn't work:
window.scrollTo(0, document.getElementById("gbqfsb").getBoundingClientRect().top);
javascript
关于java - Selenium : Clicking on toaster issues,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23480547/
Selenium IDE、Selenium RC 和 Selenium WebDriver 有什么区别;我们可以在什么样的项目中使用它们?任何建议将不胜感激。 最佳答案 Selenium IDE 是一
我的 Selenium 服务器在远程服务器上运行。我从我的本地 PC 启动我的 Selenium 脚本,它从网站获取数据。 例如,我的 Selenium 脚本执行这段 JS 代码: JSON.stri
Selenium 中“//div[.//a[text()='SELENIUM']]”和“//div[//a[text()='SELENIUM']]”有什么区别xpath。 有人可以澄清我在 xpath
我正在创建自动冒烟测试。我读到在单元测试中使用多个断言不是一个好的做法,这条规则是否也适用于使用 selenium 的 webdriver 测试? 在我的冒烟测试中,有时我会使用 20 多个断言来验证
我在一个变量中存储了一个值,在另一个变量中存储了第二个值,现在我想将这两个数字相加。我无法做到这一点,我尝试过下面的代码,但它不起作用 store 6 w sto
Selenium 中的回车键和回车键有什么区别? This related SO answer并且提供的链接说明它们是不同的。我还注意到,在使用 Firefox 24.2 时,回车键将发送一个 HTM
以下是我遇到异常的详细信息: 当我使用以下命令启动节点时,出现如下错误: F:\SeleniumGrid\Jars>java -jar selenium-server-standalone-3.0.0
我是 的新手 Selenium 我对版本号有点困惑。 Selenium 2.0 2011年发布。我刚刚下载了 Selenium IDE Firefox 扩展,版本为 1.7.2 .是否还有 IDE 的
我正在使用 Selenium 运行Codeception 2。我可以看到 Selenium 打开了浏览器并运行了测试。然后,我从代码接收中得到一个错误,即存在失败的断言。 我知道有一个HTML文件可以
Closed. This question needs to be more focused。它当前不接受答案。 想要改善这个问题吗?更新问题,使它仅关注editing this post的一个问题。
我想关闭弹出窗口(已知的窗口名称),然后返回到原始窗口。 我该怎么办? 如果我无法获得窗口中关闭按钮的常量。那么有没有达到目标的一般行为? 最佳答案 你有没有尝试过: selenium.Close()
我正在用webdriver做一个测试机器人。我有一个场景,它单击一个按钮,打开一个新窗口,并且它通过特定的xpath搜索元素,但是有时没有这样的元素,因为可以将其禁用,并且出现此错误:org.open
我是第一次使用Selenium,对这些选项不知所措。我在Firefox中使用IDE。 当我的页面加载时,它随后通过JSONP请求获取值,并在其中填充选择中的选项。 我如何让Selenium等待选择中的
我开始使用nightwatch.js编写e2e测试,我注意到我想在目标浏览器的控制台(开发人员工具)中手动检查一些错误。但总是在我打开开发者控制台时,浏览器会自动关闭它。这是selenium还是nig
我正在尝试使用以下方式刮除Glassdoor的评论: https://github.com/MatthewChatham/glassdoor-review-scraper 但是我得到了错误并且不知道如
背景 我设置了一个Selenium Grid项目,以在两种不同的浏览器Chrome和Firefox中执行测试。我正在使用Gradle执行测试。该测试将成功执行两次,一次按预期在Chrome中执行,一次
当测试失败时,运行 selenium 测试的浏览器将关闭。这在尝试调试时没有帮助。我知道我可以在失败时选择屏幕截图,但如果没有整个上下文,这并没有帮助。在浏览器仍然可用的情况下,我可以回击并检查发生了
使用 Selenium Web 驱动程序而不是 Selenium RC 启动新的测试框架是个好主意吗?对于 Selenium Web 驱动程序,并非所有 Selenium 方法都已实现。那么使用 Se
我使用 selenium 页面对象模型来定义所有页面元素。我对元素命名所遵循的命名约定不太相信,并且感觉太长了。请对此提出建议。 @FindBy(xpath = "//tbody[@id='tabvi
有一个带有按钮的 html 页面,我的 Selenium 测试正在测试,当单击按钮时,会执行一个操作。 问题是,看起来点击发生在 javascript 执行之前 - 在处理程序绑定(bind)到页面之
我是一名优秀的程序员,十分优秀!