No puede hacer clic en los signos en un mapa

votos
0

He escrito un script en Python en asociación con el selenio para hacer clic en cada una de las señales disponibles en un mapa. Sin embargo, cuando ejecuto mi script, arroja timeout exceptionerror al llegar a esta línea wait.until(EC.staleness_of(item)).

Sin embargo, antes de llegar a esa línea, el script debería haber hecho clic una vez, pero no podía? ¿Cómo puedo hacer clic en todos los signos en ese mapa cíclicamente?

Este es el enlace del sitio

Este es mi código hasta ahora (tal vez, estoy tratando con los selectores equivocadas):

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

link = https://www.findapetwash.com/

driver = webdriver.Chrome()
driver.get(link)
wait = WebDriverWait(driver, 15)
for item in wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, #map .gm-style))):
    item.click()
    wait.until(EC.staleness_of(item))
driver.quit()
Publicado el 02/09/2018 a las 05:42
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
5

Puede hacer clic en uno por uno usando selenio si, por alguna razón, no se puede utilizar la API. También es posible extraer información para cada signo sin hacer clic sobre ellos con selenio.

Aquí código para hacer clic en uno por uno:

signs = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "li.marker.marker--list")))
for sign in signs:
     driver.execute_script("arguments[0].click();", sign)
     #do something

Pruebe también sin esperar, probablemente va a funcionar.

Respondida el 05/09/2018 a las 19:43
fuente por usuario

votos
5

Yo sé que escribió usted no desea utilizar la API pero utilizando selenio para conseguir las poblaciones de los marcadores de mapa no parece ser una buena práctica y es probable que tenga problemas con él, en cambio, por qué no hacer una llamada a su servicio web mediante peticiones y analizar el JSON devuelto?

Aquí es un script de trabajo:

import requests
import json

api_url='https://www.findapetwash.com/api/locations/getAll/'

class Location:
    def __init__(self, json):
        self.id=json['id']
        self.user_id=json['user_id']
        self.name=json['name']
        self.address=json['address']
        self.zipcode=json['zipcode']
        self.lat=json['lat']
        self.lng=json['lng']
        self.price_range=json['price_range']
        self.photo='https://www.findapetwash.com' + json['photo']

def get_locations():
    locations = []
    response = requests.get(api_url)
    if response.ok:
        result_json = json.loads(response.text)
        for location_json in result_json['locations']:
            locations.append(Location(location_json))

        return locations
    else:
        print('Error loading locations')
        return False

if __name__ == '__main__':
    locations = get_locations()
    for l in locations:
        print(l.name)

Selenio

Si todavía quiere ir por el camino de selenio, en lugar de esperar hasta que todos los elementos están cargados, sólo podría detener el guión de algunos segundos o incluso un minuto para asegurarse de que todo está cargado, esto debería solucionar la excepción de tiempo de espera:

import time 

driver.get(link)
# Wait 20 seconds
time.sleep(20)

Para otras soluciones posibles, véase la respuesta aceptada aquí: Haga selenio espere 10 segundos

Respondida el 04/09/2018 a las 07:33
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more