Acceso a elementos web de selenium con python.

Estoy seguro de que esto se ha respondido en alguna parte, porque es una pregunta muy básica; sin embargo, no puedo, por mi vida, encontrar la respuesta en la web. Me siento como un completo idiota, pero tengo que preguntar, aquí va:

Estoy escribiendo un código de Python que producirá una lista de todas las direcciones de página en un dominio. Esto se hace con el uso de selenium 2. Mi problema ocurre cuando trato de acceder a la lista de todos los enlaces producidos por el selenium.

Esto es lo que tengo hasta ahora:

from selenium import webdriver import time HovedDomene = 'http://www.example.com' Listlinker = [] Domenesider = [] Domenesider.append(HovedDomene) driver = webdriver.Firefox() for side in Domenesider: driver.get(side) time.sleep(10) Listlinker = driver.find_elements_by_xpath("//a") for link in Listlinker: if link in Domenesider: pass elif str(HovedDomene) in str(link): Domenesider.append(side) print(Domenesider) driver.close() 

la variable Listlinker no contiene los enlaces que se encuentran en la página; en su lugar, la lista contiene (supongo que aquí) objetos específicos de selenium llamados WebElements. Sin embargo, no puedo encontrar ningún atributo de WebElement que me proporcione los enlaces. De hecho, no puedo encontrar ningún ejemplo de atributos de WebElement a los que se accede en Python (al menos no de la manera que puedo reproducir)

Realmente agradecería cualquier ayuda que todos me puedan dar

Sinceramente novato

Estoy familiarizado con la API de selenium de Python, pero probablemente pueda recibir un enlace usando el get_attribute(attributename) . Entonces debería ser algo como:

 linkstr = "" for link in Listlinker: linkstr = link.get_attribute("href") if linkstr in Domenesider: pass elif str(HovedDomene) in linkstr: Domenesider.append(side) 

He estado revisando tu consejo para no usar time.sleep (10) como espera de carga de página. De leer diferentes publicaciones, me parece que esperar por la carga de la página es redundante con el selenium 2. Por ejemplo, el enlace La razón es que el selenium 2 tiene una función implícita de espera de carga. Solo pensé que te lo mencionaría, ya que te tomaste el tiempo de responder mi pregunta.

A veces el selenium se comporta de manera poco clara. Y a veces el selenium arroja errores que no nos interesan.

 By byCondition; T result; // T is IWebElement const int SELENIUMATTEMPTS = 5; int timeout = 60 * 1000; StopWatch watch = new StopWatch(); public T MatchElement() where T : IWebElement { try { try { this.result = this.find(WebDriver.Instance, this.byCondition); } catch (NoSuchElementException) { } while (this.watch.ElapsedMilliseconds < this.timeout && !this.ReturnCondMatched) { Thread.Sleep(100); try { this.result = this.find(WebDriver.Instance, this.byCondition); } catch (NoSuchElementException) { } } } catch (Exception ex) { if (this.IsKnownError(ex)) { if (this.seleniumAttempts < SELENIUMATTEMPTS) { this.seleniumAttempts++; return MatchElement(); } } else { log.Error(ex); } } return this.result; } public bool IsKnownError(Exception ex) { //if selenium find nothing it throw an exception. This is bad practice to my mind. bool res = (ex.GetType() == typeof(NoSuchElementException)); //OpenQA.Selenium.StaleElementReferenceException: Element not found in the cache //issue appears when selenium interact with other plugins. //this is probably something connected with syncronization res = res || (ex.GetType() == (typeof(InvalidSelectorException) && ex.Message .Contains("Component returned failure code: 0x80070057 (NS_ERROR_ILLEGAL_VALUE)" + "[nsIDOMXPathEvaluator.createNSResolver]")); //OpenQA.Selenium.StaleElementReferenceException: Element not found in the cache res = res || (ex.GetType() == typeof(StaleElementReferenceException) && ex.Message.Contains("Element not found in the cache")); return res; } 

Lo siento por C # pero soy principiante en Python. El código se simplifica por supuesto.