无头状态时发生Python Selenium错误?

时间:2019-09-03 21:05:52

标签: python selenium google-chrome selenium-webdriver

我正在尝试获取此website's forum的整个html网页。向下滚动后,只能加载注释部分。滚动后,您会发现最终(在第4页上)将出现一个加载下一页按钮,您必须单击该按钮才能获得后续注释。经过大量搜索之后,下面的代码可以很好地到达注释的最后一页。它的大部分也来自此stackoverflow postthis

作为参考,我在Windows 10上,我的Chrome驱动程序版本为76.0.3809.132。我还使用了PhantomJS来查看哪个加载速度更快。两个驱动程序.exe文件都与我要从中执行脚本的文件放在同一目录中。直到今天我还没有遇到任何问题。

import selenium.webdriver as webdriver
from selenium.webdriver.chrome.options import Options

def scrollDownAllTheWay(driver):
    last_height = driver.execute_script("return document.body.scrollHeight")

    while True:
        driver.execute_script("window.scrollTo(0, 100*document.body.scrollHeight);")

        time.sleep(3)

        if "Load next page</button>" in driver.page_source:
            driver.find_element_by_css_selector('.myButton').click()

        new_height = driver.execute_script("return document.body.scrollHeight")

        if new_height == last_height:
            break
        last_height = new_height

#Load this and comment out chrome headless code below, if needed.
#driver = webdriver.PhantomJS()

#Chrome driver
options = Options()
options.add_argument("--headless")
driver = webdriver.Chrome(options=options)

driver.get("https://www.chessable.com/discussion/thread/58883/official-chessable-launch-schedule-2019/")

scrollDownAllTheWay(driver)

当我使用webdriver.PhantomJS()运行上面的脚本时(用它代替了Chrome部分),我没有任何问题。该功能一直运行到无头浏览器到达最后一页为止。很好。

当我用webdriver.Chrome()无头运行下面的脚本时,遇到以下错误:

ElementClickInterceptedException: Message: element click intercepted: Element <button id="load-next-comments" class="myButton">...</button> is not clickable at point (388, 23). Other element would receive the click: <div class="headerHolder">...</div>   (Session info: headless chrome=76.0.3809.132)

我找不到任何有助于解决此问题的 。更为奇怪的是,如果禁用options.add_argument("--headless")部分(将其注释掉),页面加载就很好了,并完成了整个页面的滚动。我可以看到最终点击是在本地Chrome浏览器中执行的,然后看到它停止滚动并在完成后单击。

问题:为什么无头Chrome会话在这里不能正常运行,但无头版本却如此?

编辑::我刚刚发现了这个post,这可能会有所帮助,但我不确定。

注意:我愿意使用其他浏览器驱动程序,例如FireFox()或其他任何可能的解决方法,但问题仍然存在。

3 个答案:

答案 0 :(得分:1)

该按钮上方有一个元素,使其不可单击。 如果您更改:

for err in names:
        filename_list.append((err[1].replace("* FROM CLIP NAME: ", "").replace("_MOV", ".mov")))

driver.find_element_by_css_selector('.myButton').click()

应该可以。实际上,除非您要进行“质量检查”,否则使用javascript进行所有操作并不是一个坏主意。

答案 1 :(得分:1)

我在Chromedriver中遇到了同样的问题。

通过在我的代码中添加以下选项来解决此问题:

options.add_argument("--window-size=1920,1080")
options.add_argument("--start-maximized")
options.add_argument("--headless")

PS:我在这里找到了解决方案:https://github.com/SeleniumHQ/selenium/issues/4685

答案 2 :(得分:0)

JavaScript不是必需的。如果您将window-size设置为headless模式,它将单击next_page按钮。希望这会有所帮助。

import selenium.webdriver as webdriver
from selenium.webdriver.chrome.options import Options

def scrollDownAllTheWay(driver):
    last_height = driver.execute_script("return document.body.scrollHeight")

    while True:
        driver.execute_script("window.scrollTo(0, 100*document.body.scrollHeight);")

        time.sleep(3)

        if "Load next page</button>" in driver.page_source:

            driver.find_element_by_css_selector('.myButton').click()
            print('clicked')

        new_height = driver.execute_script("return document.body.scrollHeight")

        if new_height == last_height:
            break
        last_height = new_height


options = Options()
options.add_argument("--headless")
options.add_argument('window-size=1920x1080')
driver = webdriver.Chrome(options=options)

driver.get("https://www.chessable.com/discussion/thread/58883/official-chessable-launch-schedule-2019/")

scrollDownAllTheWay(driver)

要验证代码是否有效,只需在屏幕截图之前或之后进行截图,您就会知道它是否在起作用。

import selenium.webdriver as webdriver
from selenium.webdriver.chrome.options import Options

def scrollDownAllTheWay(driver):
    last_height = driver.execute_script("return document.body.scrollHeight")
    i = 1
    while True:
        driver.execute_script("window.scrollTo(0, 100*document.body.scrollHeight);")

        time.sleep(3)

        if "Load next page</button>" in driver.page_source:
            driver.save_screenshot("screenshot_{}.png".format(i))
            i = i+1
            driver.find_element_by_css_selector('.myButton').click()
            driver.save_screenshot("screenshot_{}.png".format(i))
            i = i + 1
            print('clicked')

        new_height = driver.execute_script("return document.body.scrollHeight")

        if new_height == last_height:
            break
        last_height = new_height


options = Options()
options.add_argument("--headless")
options.add_argument('window-size=1920x1080')
driver = webdriver.Chrome(options=options)

driver.get("https://www.chessable.com/discussion/thread/58883/official-chessable-launch-schedule-2019/")

scrollDownAllTheWay(driver)