【问题标题】:Broken pipe error selenium webdriver, when there is a gap between commands?Broken pipe error selenium webdriver,当命令之间有间隙时?
【发布时间】:2018-12-16 18:45:19
【问题描述】:

Ubuntu 18.x + selenium webdriver(Firefox)

面对一个奇怪的问题,如果我将run 全部放在一起,则以下块可以工作

from selenium import webdriver
url = 'https://indiamart.com'
driver = webdriver.Firefox()
driver.get(url)
driver.find_element_by_xpath(xpath).click()

我尝试过的每个url 都会发生这种情况。

但是,如果我一次执行一行,它会给出

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/media/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 326, in get
    self.execute(Command.GET, {'url': url})
  File "/media/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 312, in execute
    response = self.command_executor.execute(driver_command, params)
  File "/media/lib/python3.6/site-packages/selenium/webdriver/remote/remote_connection.py", line 472, in execute
    return self._request(command_info[0], url, body=data)
  File "/media/lib/python3.6/site-packages/selenium/webdriver/remote/remote_connection.py", line 495, in _request
    self._conn.request(method, parsed_url.path, body, headers)
  File "/usr/lib/python3.6/http/client.py", line 1239, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "/usr/lib/python3.6/http/client.py", line 1285, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "/usr/lib/python3.6/http/client.py", line 1234, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "/usr/lib/python3.6/http/client.py", line 1065, in _send_output
    self.send(chunk)
  File "/usr/lib/python3.6/http/client.py", line 986, in send
    self.sock.sendall(data)
BrokenPipeError: [Errno 32] Broken pipe

这是code上的error

driver.get(url)

但是,如果我在 Broken Pipe error 之后再次执行同一行,它会起作用并获得 url

我很困惑。谁能帮帮我。

谢谢

【问题讨论】:

  • url 定义在哪里?
  • 嗨,Andrei,让它含糊不清,因为每个网址都会发生这种情况。
  • 你可以在非无头模式下运行它,这样你就可以看到浏览器窗口打开和(也许)关闭了吗?
  • 用 chrome 试试看是否会出现同样的问题

标签: python selenium ubuntu selenium-webdriver


【解决方案1】:

这是geckodriver最新版本v0.21.0与最新版selenium v​​3.11匹配的已知bug

要解决此错误: a) downgrade geckodriver 到 v0.20.1 或更早版本 b) 等待即将发布的 selenium 和/或 geckodriver 版本中推出错误修复/缓解措施

此错误源于 v 0.21 中新增的 Keep-Alive 功能支持。但是,geckodriver 在 0.21 中的默认超时设置为 5s,这非常短。

这个错误被here 用于 geckodriver 和here 用于 selenium。

【讨论】:

    【解决方案2】:

    此错误消息...

    BrokenPipeError: [Errno 32] Broken pipe
    

    ...暗示 GeckoDriver 服务器进程在写入套接字时收到了SIGPIPEBrokenPipeError 通常发生在进程尝试写入在客户端完全关闭的套接字时。这可能发生在 GeckoDriver 服务器进程没有等到从服务器接收到所有数据而只是尝试关闭它与客户端打开的套接字(使用关闭函数)时。 p>

    在这里你可以找到关于How to prevent errno 32 broken pipe?的详细讨论

    解决方案

    • 当您在所需元素上调用 click() 时向前推进,您需要诱导 WebDriverWait 以使 元素可点击,如下所示:

      driver.get(url)
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "xpath"))).click()
      

    注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
    • 同样,BrokenPipeError 也可能发生在您的请求阻塞或在请求端(服务器)之后花费的时间过长暂停。服务器可能会关闭连接,然后,当响应端(客户端)尝试写入套接字时,它可能会抛出BrokenPipeError。在这种情况下,您可以按如下方式设置page_load_timeout

      driver.set_page_load_timeout(3)
      

    在这里你可以找到关于How to set the timeout of 'driver.get' for python selenium 3.8.0?的详细讨论

    【讨论】:

      【解决方案3】:

      在最近的版本中,他们有问题,用最新版本升级 selenium

      pip install -U selenium

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-24
        • 1970-01-01
        • 1970-01-01
        • 2019-01-24
        • 2017-05-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多