在使用 Selenium 自动执行测试时如何处理在调试器中暂停的覆盖
How to deal with the overlay Paused in debugger while automated test execution using Selenium
每次我尝试访问这个 website and open google-chrome-devtools 我都无法通过检查器检查任何元素,因为 UI 有一个覆盖层和一条消息 Paused in debugger
.
upvoted and accepted answer of this discussion 说要检查“源”选项卡,如果您在 'Mouse' 下设置了任何断点,请在“事件侦听器断点”面板下检查。我已经交叉检查 Sources
-> EventListenerBreakpoint
的 none 是否已设置。
upvoted and accepted answer of this discussion 说要检查小八角形 stop/pause 标志(在 Chrome "Sources" 的左下角)是否有颜色(蓝色或紫色)。我不确定为什么我需要为选定的网站额外执行此操作。
快照:
upvoted and accepted answer of this discussion 谈到了手动步骤。
所有解决方案似乎都指向手动过程。但在我看来,这个问题是 无法 getPageSource()
.
背后的根本原因
代码试验:
System.setProperty("webdriver.chrome.driver", "C:\Utility\BrowserDrivers\chromedriver.exe");
ChromeOptions options = new ChromeOptions();
options.addArguments("start-maximized");
options.addArguments("disable-infobars");
options.addArguments("--disable-extensions");
WebDriver driver = new ChromeDriver(options);
driver.get("http://rd.huangpuqu.sh.cn/website/html/shprd/shprd_tpxw/List/list_0.htm");
输出:Chrome 打开但没有导航到 url。
所以我的问题是:
- 什么情况下会出现
Paused in debugger
错误?
- 是否是前端开发的错误?
- 如何通过 Selenium 在 自动测试 期间绕过此错误?
什么情况下会出现Paused in debugger
错误?
任何时候您在打开开发工具的情况下访问此页面。 debugger;
行将暂停 javascript 执行,但如果开发工具关闭,浏览器将忽略它。
是否是前端开发的错误?
在这种情况下,不——他们是故意把你拒之门外。此函数的目的是暂停执行,然后在恢复时间超过 100 毫秒时将浏览器重定向到其他页面。我推测这是为了干扰像 selenium 这样的自动爬虫,因为普通用户不会受到影响,人类开发人员可以绕过它。
如何通过 Selenium 在自动测试期间绕过此错误?
我的第一个建议是尝试 运行 Selenium,如果可以的话。如果没有,使用热键恢复执行 (F8)。 您可以使用任何您喜欢的方法来生成按键;使用 java.awt 包,它看起来像这样:
Robot robot = null;
try
{
robot = new Robot();
}
catch(Exception e)
{
//handle failure
}
robot.keyPress(KeyEvent.VK_F8);
请记住,您必须在 100 毫秒内触发它,因此请使用您喜欢的任何逻辑来检测块并快速响应。如果你只是想要一些快速而肮脏的东西,我会让它每隔 50 毫秒发送一次 F8 按键,持续一段时间,直到你确定页面已加载。
编辑: 经进一步调查,此页面非常混乱,并且对任何打开开发工具的人都有敌意。触发 debugger;
的函数不止一个,而且只要您在页面上,它们就会在计时器上重复调用。 运行 headlessly 似乎是最好的选择,除非你想在整个会话中继续发送垃圾邮件 F8。
每次我尝试访问这个 website and open Paused in debugger
.
upvoted and accepted answer of this discussion 说要检查“源”选项卡,如果您在 'Mouse' 下设置了任何断点,请在“事件侦听器断点”面板下检查。我已经交叉检查 Sources
-> EventListenerBreakpoint
的 none 是否已设置。
upvoted and accepted answer of this discussion 说要检查小八角形 stop/pause 标志(在 Chrome "Sources" 的左下角)是否有颜色(蓝色或紫色)。我不确定为什么我需要为选定的网站额外执行此操作。
快照:
upvoted and accepted answer of this discussion 谈到了手动步骤。
所有解决方案似乎都指向手动过程。但在我看来,这个问题是 getPageSource()
.
代码试验:
System.setProperty("webdriver.chrome.driver", "C:\Utility\BrowserDrivers\chromedriver.exe");
ChromeOptions options = new ChromeOptions();
options.addArguments("start-maximized");
options.addArguments("disable-infobars");
options.addArguments("--disable-extensions");
WebDriver driver = new ChromeDriver(options);
driver.get("http://rd.huangpuqu.sh.cn/website/html/shprd/shprd_tpxw/List/list_0.htm");
输出:Chrome 打开但没有导航到 url。
所以我的问题是:
- 什么情况下会出现
Paused in debugger
错误? - 是否是前端开发的错误?
- 如何通过 Selenium 在 自动测试 期间绕过此错误?
什么情况下会出现
Paused in debugger
错误?任何时候您在打开开发工具的情况下访问此页面。
debugger;
行将暂停 javascript 执行,但如果开发工具关闭,浏览器将忽略它。是否是前端开发的错误?
在这种情况下,不——他们是故意把你拒之门外。此函数的目的是暂停执行,然后在恢复时间超过 100 毫秒时将浏览器重定向到其他页面。我推测这是为了干扰像 selenium 这样的自动爬虫,因为普通用户不会受到影响,人类开发人员可以绕过它。
如何通过 Selenium 在自动测试期间绕过此错误?
我的第一个建议是尝试 运行 Selenium,如果可以的话。如果没有,使用热键恢复执行 (F8)。 您可以使用任何您喜欢的方法来生成按键;使用 java.awt 包,它看起来像这样:
Robot robot = null;
try
{
robot = new Robot();
}
catch(Exception e)
{
//handle failure
}
robot.keyPress(KeyEvent.VK_F8);
请记住,您必须在 100 毫秒内触发它,因此请使用您喜欢的任何逻辑来检测块并快速响应。如果你只是想要一些快速而肮脏的东西,我会让它每隔 50 毫秒发送一次 F8 按键,持续一段时间,直到你确定页面已加载。
编辑: 经进一步调查,此页面非常混乱,并且对任何打开开发工具的人都有敌意。触发 debugger;
的函数不止一个,而且只要您在页面上,它们就会在计时器上重复调用。 运行 headlessly 似乎是最好的选择,除非你想在整个会话中继续发送垃圾邮件 F8。