Aquí es el código que estoy utilizando para la búsqueda de amazon de mi tornado web app. Por el momento sólo tengo una de estas clases (y uno webdriver) crea una instancia. Puede que desee un grupo de ellos en el futuro (sí, sé que hay selenum de la cuadrícula, pero esa no es mi pregunta.) Mi pregunta es, ¿por qué es el __init__, al parecer, no se ejecuta? ¿Por qué hay un attributeError para acceder al mismo.cola de var, que está claramente definido en el __init__?
import asyncio
import uuid
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.expected_conditions import presence_of_element_located
from selenium.common.exceptions import NoSuchElementException
class Searcher:
def __init___(self):
self.driver = webdriver.Firefox(executable_path="/home/felix/project/geckodriver")
self.wait = WebDriverWait(self.driver, 10)
self.driver.get("https://amazon.com/")
self.queue = []
async def _search(self, query):
self.driver.find_element(By.ID, "twotabsearchtextbox").send_keys("pixel" + Keys.RETURN)
self.wait.until(presence_of_element_located((By.XPATH,
"//div[contains(@class, 'sg-col-inner')]/div[contains(@class, 'a-section')]"
"/div[contains(@class, 'a-section')]")))
el = self.driver.find_elements(By.XPATH,
"//div[contains(@class, 'a-section')]/div[h2][not(contains(.,'Sponsored'))]"
"[contains(@class, 'a-section')]/..")
out=[]
for e in range(len(el)):
try:
out+=[{"price": el[e].find_element(By.XPATH, ".//span[contains(@class, 'a-price-whole')]").text + "." +
el[e].find_element(By.XPATH, ".//span[contains(@class, 'a-price-fraction')]").text,
"title": el[e].find_element(By.XPATH, ".//h2").text}]
except NoSuchElementException:
pass
return out
def search(self, query):
_id = uuid.uuid4()
self.queue.append(_id)
async def help(self):
while 1:
if _id == self.queue[0]:
return await self._search(query)
await asyncio.sleep(0.5)
res = help(self)
self.queue.pop()
return res
a = Searcher()
print(asyncio.run(a.search("test")))
Aquí está el error:
Traceback (most recent call last):
File "/home/felix/project/search.py", line 49, in <module>
print(asyncio.run(a.search("test")))
File "/home/felix/project/search.py", line 38, in search
self.queue.append(_id)
AttributeError: 'Searcher' object has no attribute 'queue'