我在python(含硒)上编写了一个网络抓取程序,效果很好。最后一步是添加无头功能。 问题是,当脚本无头运行时,在特定时刻(应单击链接刷新页面时),终端会显示以下错误:
selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element <a href="javascript:void(0);" onclick="prtl.refresh(this);">...</a> is not clickable at point (217, 157). Other element would receive the click: <span ewnet:toggler="290" class="prtl">...</span>
奇怪的是,当同一脚本不是无头脚本时,硒不会引发错误,并且一切正常。
我尝试使用几种方法来到达元素,但存在相同的错误。
这是脚本决定浏览器是否无头的时间:
# create driver
if headless:
chromedriver = './chromedriver'
options = webdriver.ChromeOptions()
options.add_argument('headless')
driver = webdriver.Chrome(executable_path = chromedriver, chrome_options = options)
else:
driver = webdriver.Chrome('./chromedriver')
我要单击的元素看起来像这样:
<a href='some_url' onclick='refresh(this)'>
<span class='name'>refresh page!</span>
</a>
并且我的脚本通过xpath
标签上的<a>
对其进行搜索。
答案 0 :(得分:0)
即使没有头,也要尝试设置窗口大小。
我不完全记得这一点,但是几年前我在硒上编写端到端测试时遇到了同样的错误。我认为它仍然需要视口大小,如果无头(?),则引擎默认会将其优化为0x0。
答案 1 :(得分:0)
解决方案是确保窗口大小足够大以使对象可单击,否则window-size属性设置为0x0并且对象将彼此弯曲:
options.add_argument('window-size=2000x1500')
因此,代码将如下所示:
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('window-size=2000x1500')
这适用于chromedriver
。我没有检查其他无头浏览器,但是期望相同或相似的行为。