断管错误硒webdriver,当命令之间有差距?

Sid*_*Sid 5 python ubuntu selenium 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()
Run Code Online (Sandbox Code Playgroud)

每次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
Run Code Online (Sandbox Code Playgroud)

这是error关于code

driver.get(url)

但是,如果我在Broken Pipe error它工作后再次执行相同的行并获得url.

我很困惑.有人可以帮我吗.

谢谢

小智 5

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

要解决这个错误:a)将geckodriver降级到v0.20.1或更早版本b)等待在即将发布的selenium和/或geckodriver版本中推出bugfix /缓解措施

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

这个bug追踪这里的geckodriver和这里的硒.


Deb*_*anB 2

这个错误信息...

BrokenPipeError: [Errno 32] Broken pipe
Run Code Online (Sandbox Code Playgroud)

...意味着GeckoDriver服务器进程已接收SIGPIPE到写入套接字的时间。BrokenPipeError通常当进程尝试写入客户端完全关闭的套接字时发生。当GeckoDriver服务器进程不等待接收到来自服务器的所有数据并只是尝试关闭它与客户端打开的套接字(使用 close 函数)时,可能会发生这种情况。

在这里您可以找到有关如何防止 errno 32 破管? 的详细讨论。

解决方案

  • 当您调用click()所需的元素时,您需要引发WebDriverWait以使该元素可单击,如下所示:

    driver.get(url)
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "xpath"))).click()
    
    Run Code Online (Sandbox Code Playgroud)

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

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
Run Code Online (Sandbox Code Playgroud)
  • 同样,如果您的请求阻止或花费太长时间并且在请求端BrokenPipeError(服务器)超时后,也可能会发生这种情况。服务器可能会关闭连接,然后,当响应方(客户端)尝试写入套接字时,它可能会抛出一个. 在这种情况下,您可以按如下方式设置:BrokenPipeErrorpage_load_timeout

    driver.set_page_load_timeout(3)
    
    Run Code Online (Sandbox Code Playgroud)

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