Impossible de cliquer sur les panneaux sur une carte

voix
0

J'ai écrit un script en python en association avec le sélénium à cliquer sur chacun des signes disponibles sur une carte. Cependant, quand j'exécuter mon script, il jette l' timeout exceptionerreur après avoir atteint cette ligne wait.until(EC.staleness_of(item)).

Cependant, avant de frapper cette ligne, le script devrait avoir cliqué une fois, mais il ne pouvait pas? Comment puis-je cliquer sur tous les signes de cette carte cyclique?

Ceci est le lien du site

Ceci est mon code à ce jour (peut - être, je suis en train avec les sélecteurs mauvais):

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()
Créé 02/09/2018 à 05:42
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
5

Vous pouvez cliquer sur un par un à l'aide Sélénium si, pour certaines raisons, vous ne pouvez pas utiliser l'API. En outre, il est possible d'extraire des informations pour chaque signe sans cliquer dessus avec Sélénium.

Voici le code à cliquer sur un par un:

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

Essayez aussi sans attendre, ne fonctionnera probablement.

Créé 05/09/2018 à 19:43
source utilisateur

voix
5

Je sais que vous avez écrit que vous ne voulez pas utiliser l'API, mais en utilisant Sélénium pour obtenir les emplacements des marqueurs de carte ne semble pas une bonne pratique et vous êtes susceptibles d'avoir des problèmes avec elle, au contraire, pourquoi ne pas faire un appel à leur service Web utilisant des requêtes et analyser le JSON retourné?

Voici un script de travail:

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)

Sélénium

Si vous voulez toujours aller dans le sens de Sélénium, au lieu d'attendre jusqu'à ce que tous les éléments sont chargés, vous pouvez simplement arrêter le script pendant quelques secondes ou même une minute pour vous assurer que tout est chargé, cela devrait fixer l'exception du délai d'attente:

import time 

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

Pour d' autres solutions de contournement possibles, voir ici la réponse acceptée: Faites Sélénium attendez 10 secondes

Créé 04/09/2018 à 07:33
source utilisateur

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