美文网首页
Message: unknown error: call fun

Message: unknown error: call fun

作者: Py_Explorer | 来源:发表于2018-09-04 17:38 被阅读0次

    1.问题说明

    出现此问题为chrome和chromedriver版本不匹配
    这是在网上查询的浏览器与驱动匹配信息,但是已经不是最新的了

    image.png

    我这里稍作补充

    V2.29 V56-58

    V2.30 V57-59

    V2.31 V58-60

    V2.32 V59-61

    V2.33 V60-62

    V2.34 V61-63

    V2.35 V62-64

    V2.36 V63-65
    V2.37 V66
    V2.38 V67
    V2.39 V68

    我使用的浏览器chrom V68的,所以查找下载最新驱动V2.39,更新驱动,重新跑程序,一切OK。

    这里给大家送上chrome驱动的下载地址,找了很多网站,发现这个更好用一些

    http://npm.taobao.org/mirrors/chromedriver/

    http://chromedriver.storage.googleapis.com/index.html

    2. centos安装chrome和使用chrome-headless

    1. 下载安装chrome,然后查看chrome版本

    2. 由上面下载对应的chomedriver,放到环境/usr/bin/目录下

    3. 启动

    4. 运行代码

      from selenium.webdriver.chrome.options import Options
      from selenium import webdriver
      from selenium.webdriver.common.keys import Keys 
      import time
      
      options = Options()
      options.add_argument('--headless')
      options.add_argument('--no-sandbox')
      # options.add_argument('--disable-dev-shm-usage')
      driver = webdriver.Chrome(executable_path="/root/chromedriver",
      chrome_options=options)
      driver.get('https://www.baidu.com')
      print driver.title //百度一下, 你就知道
      driver.find_element_by_id('kw').send_keys('python')
      driver.find_element_by_id('kw').send_keys(Keys.RETURN)
      time.sleep(2)
      driver.page_source
      

    错误:selenium WebDriverException: Message: unknown error: DevToolsActivePort file doesnt exist

    这个错误是由上面的 options.add_argument('--no-sandbox'),如果把这一行注释掉,就有可能出现这个错误。

    3. 禁用图片

    3.1 网上大多数的资料给的是以下这种方式, 但是在Headless的模式下并没有生效, 在非Headless的模式下是生效的。

    prefs = {"profile.managed_default_content_settings.images": 2}
    chrome_options.add_experimental_option("prefs", prefs)
    

    3.2 以下的这种方式在Headless的模式下是生效的, 非Headless模式下也是生效的。

    chrome_options.add_argument('blink-settings=imagesEnabled=false')
    

    3.3. 添加代理

    chrome_options.add_argument("--proxy-server=http://" + ip:port)
    

    3.4. 修改User-Agent

    Chrome Headless模式为什么要修改User-Agent, 来看一下同一个浏览器不同模式下的User-Agent:
    "User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/62.0.3202.89 Safari/537.36"
    "User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36"
    # 修改User-Agent
    chrome_options.add_argument('user-agent= '你想修改成的User-Agent')
    

    3.5. 打开新的标签页

    #打开空白标签页的方式有很多, 在此只演示一种
    js='window.open("https://www.jianshu.com/p/4fef4142b33f");'
    driver.execute_script(js) # 通过打开新的标签页, 可以节省浏览器打开的时间,减少资源的浪费。
    

    3.6. 关闭新打开的标签页

    # 分两步走
    # 1.获取标签页的句柄
    handlesList = driver.window_handles  # 返回一个浏览器中所有标签的句柄列表, 顺序为打开窗口的顺序
    # 2. 切换窗口, 关闭标签
    driver.switch_to.window(handlesList[0]) # 切换到百度标签
    driver.close()    # 关闭标签,这里必须用 driver.close() ,用    driver.quit()会导致浏览器关闭
    

    3.7. driver使用完之后切记要driver.quit(), 不然或导致内存爆满

    3.8. 其他:

    image.png

    切换标签的时候,我之前用的方法会出现这种状况, 原因是该方法不支持了:
    不支持的不只是这一种, 还有如下:

    driver.switch_to_active_element()       ==>    driver.switch_to.active_element()            定位到当前聚焦的元素上
    
    driver.switch_to_alert()                ==>    driver.switch_to.alert()                     切换到alert弹窗
    
    driver.switch_to_default_content()      ==>    driver.switch_to.default_content()           切换到最上层页面
    
    driver.switch_to_frame(frame_reference)  ==>   driver.switch_to.frame(frame_reference)       通过id、name、element(定位的某个元素)、索引来切换到某个frame
    
    driver.switch_to_window()                ==>   driver.switch_to.window()                     切换到指定的标签页
    
    driver.switch_to.parent_frame()  switch_to中独有,可以切换到上一层的frame,对于层层嵌套的frame很有用
    
    注: 用pycharm编程的时候还是提示switch_to_window, 但此方法已经不能用了!!
    

    相关文章

      网友评论

          本文标题:Message: unknown error: call fun

          本文链接:https://www.haomeiwen.com/subject/uhlnwftx.html