Selenium Webdriver管道损坏,命令之间有间隔时出错?

时间:2018-07-09 06:42:50

标签: python selenium ubuntu selenium-webdriver

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

这是error上的code

driver.get(url)

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

我非常非常困惑。有人可以帮我吗?

谢谢

3 个答案:

答案 0 :(得分:5)

这是geckodriver最新版本v0.21.0与最新版本的硒v3.11匹配的已知错误

要解决此错误,请执行以下任一操作: a)downgrade geckodriver至v0.20.1或更早版本 b)等待即将发布的selenium和/或geckodriver版本中的错误修正/缓解措施

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

对于geckodriver和here,对于硒,该错误已被跟踪here

答案 1 :(得分:1)

此错误消息...

BrokenPipeError: [Errno 32] Broken pipe

...表示 GeckoDriver 服务器进程在写入套接字时已收到SIGPIPEBrokenPipeError通常在进程尝试写入客户端完全关闭的套接字时发生。当 GeckoDriver 服务器进程没有等到收到服务器的所有数据,而只是试图关闭它与客户端打开的套接字时(使用关闭功能),可能会发生这种情况。 >

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

解决方案

  • 在对所需元素进行click()调用时继续前进,您需要诱使 WebDriverWait 使元素可点击,如下所示:< / p>

    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 em>(服务器)超时。服务器可能会关闭连接,然后,当响应端(客户端)尝试写入套接字时,它可能会抛出BrokenPipeError。在这种情况下,您可以如下设置page_load_timeout

    driver.set_page_load_timeout(3)
    

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

答案 2 :(得分:1)

在最新版本中,他们遇到了问题,将硒升级到最新版本

点安装-U硒