当我在无头模式下运行测试脚本时 铬浏览器,元素链接不可见,无法执行linkElement.click()
。 在头部模式下一切正常。所有其他信息都在堆栈跟踪中。 请问有人知道该怎么做吗?
堆栈跟踪:
发生错误:消息:元素不可见(会话信息:
无外设 chrome=60.0.3112.90(
(驱动程序信息:chromedriver =2.31.488763 (092de99f48a300323ecf8c2a4e2e7cab51de5ba8(,platform=Windows NT 6.1.7601 SP1 x86_64(回溯(最近最后一次调用(:文件 "C:ik-x.py",第 148 行,在主 func(nik( 中(文件 "C:\lib\support.py",第
121 行,在包装器中
raise ret
文件 "C:\lib\support.py",第 108 行,在 newFunc
中 res[0] = func(*args, **kwargs(文件 "C:\testcasesik-1003.py",第 37 行,在 testcase i.click((File "C:\Python36\lib\site-packages\selenium\webdriver\remote\webelement.py"中,第 7 行 7,在点击self._execute(Command.CLICK_ELEMENT(文件 "C:\Python36\lib\site-packages\selenium\webdriver\remote\webelement.py",第
4
行 93,在_execute
返回 self._parent.execute(command, params(
文件 "C:\Python36\lib\site-packages\selenium\webdriver\remote\webdriver.py", 第 25 行 6,在
执行
self.error_handler.check_response(response(
文件中 "C:\Python36\lib\site-packages\selenium\webdriver\remote\errorhandler.py",第
194 行,在 check_response 引发exception_class(消息、
屏幕、堆栈跟踪(中
selenium.common.exceptions.ElementNotVisibleException: 消息:元素不可见
(会话信息:无头 chrome=60.0.3112.90(
(驱动程序信息: chromedriver=2.31.488763 (092de99f48a300323ecf8c2a4e2e7cab51de5ba8(,platform=Windows NT 6.1.7601 SP1 x86_64(
这是我的代码段:icons = nik.elementLeftmenuSportIcons()
for i in icons[:-1]:
try:
i.click()
来自测试页面的 HTML:<a href="#" class="default b_futbal gaPageEventElement" data-ga-cat="Sporty" data-ga-action="futbal">
<span class="left-menu-only-large-res">Futbal</span>
</a>
我认为问题是,该元素在无头Chrome的默认视图框(600x800(中实际上不可见。
启动镶边时,必须将无头浏览器的窗口大小设置为参数。我正在使用javascript(我认为API在python下看起来很相似(:
var Options = require('selenium-webdriver/chrome').Options;
var options = new Options();
options.addArguments('headless');
options.addArguments('disable-gpu');
options.addArguments('window-size=1200,1100');
browser = builder.forBrowser('chrome').setChromeOptions(options).build();
附加信息
我也通过网络驱动程序设置了窗口大小browser.manage().window().setSize(1200,1100);
但是这个命令在无头铬中是不够的。在非无头变体中,这是有效的。
您可以通过以下两种方式执行此操作。
1.在chrome选项中传递窗口大小,如下所述(在实例化驱动程序实例之前(:
ChromeOptions options = new ChromeOptions()
options.addArguments("headless");
options.addArguments("window-size=1200,1100");
WebDriver driver = new ChromeDriver(options);
2.实例化Chrome驱动程序后设置窗口大小:
WebDriver webDriver= new ChromeDriver();
webDriver.manage().window().setSize(new Dimension(1200,1100));
options.addArguments('window-size=1200,1100'(;
在无头铬模式下为我工作:)非常感谢@powerpete
以下是时髦无头镀铬的完整设置:-
ChromeOptions options = new ChromeOptions()
DesiredCapabilities capabilities = DesiredCapabilities.chrome()
options.addArguments('headless','disable-gpu','--test-type','--ignore-certificate-errors')
options.addArguments('window-size=1200,1100');
capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
capabilities.setCapability(ChromeOptions.CAPABILITY, options)
driver = {new ChromeDriver(capabilities)}
选项。AddArguments("--user-agent=Mozilla/5.0 (Windows NT 10.0;赢64;x64( AppleWebKit/537.36 (KHTML, like Gecko( Chrome/97.0.4692.99 Safari/537.36"(;
添加这个帮助了我
在这里添加它作为将来的参考,因为我遇到了同样的问题。问题是我试图访问的网站禁止了我的IP,而我正在使用PROXY_TOOL来访问它。
在完整模式下,它工作正常,但在无头模式下,它显示它无法找到元素。因此,我在显示找不到元素之前使用此函数截取了屏幕截图。(蟒蛇 3.9.5(
def get_screenshot(self, filename):
screenshot_bytes = self.driver.get_screenshot_as_png()
with open(filename, "wb") as file:
file.write(screenshot_bytes)
保存屏幕截图后,我看到该网站出现IP阻止错误。因此,我使用 PROXY_IP="127.0.0.1", PROXY_PORT=9666 作为参数。PROXY_TOOL正在提供代理访问。它奏效了。
options.add_argument("--proxy-server=socks5://" + str(PROXY_IP) + ":" + str(PROXY_PORT))
使用屏幕截图功能在无头模式下查看网站上可见的内容。查看如果元素不可见,则会出现什么样的问题,使用窗口大小调整使其可见。并调整根据。这可能不是正确的答案,但它针对的是相同的问题。
如果更改窗口大小对像我这样的人不起作用,则可能是HTML实际上在无头模式和标题模式之间更改。
我遇到了类似的问题,但是无头在FireFox而不是Chrome中工作。Chrome元素的Xpath仅在标题模式下工作。我发现HTML在Chrome的无头模式下略有变化。
在Chrome中使用无头模式时,我通过将Chrome上元素中的Xpath替换为FireFox上元素中的Xpath来解决此问题。