Casseur d’erreur de selenium Webdriver cassé, lorsqu’il y a un écart entre les commandes?

Ubuntu 18.x + selenium webdriver(Firefox)

Face à un problème étrange, le bloc suivant fonctionne si je l’ run tous ensemble

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

Cela se produit avec chaque url j’ai essayé.

Cependant, si j’exécute une ligne à la fois, cela donne

 Traceback (most recent call last): File "", line 1, in  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 

C’est l’ error sur le code

driver.get(url)

Cependant, si j’exécute la même ligne après l’ Broken Pipe error cela fonctionne et obtient l’ url .

Je suis très très confus. Est-ce que quelqu’un peut m’aider.

Merci

Ceci est un bogue connu de la dernière version de la version 0.21.0 de geckodriver associée à la dernière version de selenium v3.11

Pour contourner ce problème, procédez comme suit: a) rétrograder geckodriver vers la version v0.20.1 ou antérieure b) attendre que le correctif / atténuation soit appliqué dans les prochaines versions de selenium et / ou de geckodriver

Ce bug provient du support nouvellement ajouté dans la version 0.21 de la fonctionnalité Keep-Alive. Cependant, le délai d’attente par défaut de geckodriver dans 0.21 est défini sur 5s, ce qui est exceptionnellement court.

Ce bogue est suivi ici pour geckodriver et ici pour le selenium.

Ce message d’erreur …

 BrokenPipeError: [Errno 32] Broken pipe 

… implique que le processus du serveur GeckoDriver a reçu un SIGPIPE lors de l’écriture sur un socket. BrokenPipeError se produit généralement lorsqu’un processus tente d’écrire sur un socket complètement fermé du côté client. Cela peut se produire lorsque le processus du serveur GeckoDriver n’attend pas que toutes les données du serveur soient reçues et essaie simplement de fermer le socket (en utilisant la fonction close) qu’il avait ouvert avec le client.

Ici vous pouvez trouver une discussion détaillée sur Comment prévenir errno 32 pipe cassée?

Solution

  • En allant de l’avant lorsque vous appelez click() sur l’élément souhaité, vous devez induire WebDriverWait pour que l’ élément soit cliquable comme suit:

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

Remarque : Vous devez append les importations suivantes:

 from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC 
  • Là encore, BrokenPipeError peut également se produire si votre demande est bloquée ou prend trop de temps et après l’expiration du délai d’attente (serveur) côté requête . Le serveur peut fermer la connexion, puis, lorsque le côté réponse (client) tente d’écrire sur le socket, il peut lancer une BrokenPipeError . Dans ce cas, vous pouvez définir page_load_timeout comme suit:

     driver.set_page_load_timeout(3) 

Ici vous pouvez trouver une discussion détaillée sur comment définir le délai d’attente de ‘driver.get’ pour python selenium 3.8.0?