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
。
我非常非常困惑。有人可以帮我吗?
谢谢
答案 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,这非常短。
答案 1 :(得分:1)
此错误消息...
BrokenPipeError: [Errno 32] Broken pipe
...表示 GeckoDriver 服务器进程在写入套接字时已收到SIGPIPE
。 BrokenPipeError
通常在进程尝试写入客户端完全关闭的套接字时发生。当 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硒