Kan ikke klikke på skilt på et kart

stemmer
0

Jeg har skrevet et manus i python i forbindelse med selen å klikke på hver av de tegn som er tilgjengelige i et kart. Men når jeg kjøre mitt manus, det kaster timeout exceptionfeil ved å nå denne linjen wait.until(EC.staleness_of(item)).

Men før du treffer den linjen, manuset burde ha klikket en gang, men det kunne ikke? Hvordan kan jeg klikker på alle tegn i det kartet syklisk?

Dette er link til nettstedet

Dette er koden min så langt (kanskje jeg prøver med feil velgere):

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()
Publisert på 02/09/2018 klokken 05:42
kilden bruker
På andre språk...                            


2 svar

stemmer
5

Du kan klikke én etter én hjelp Selen hvis for noen grunner, kan du ikke bruke API. Det er også mulig å hente ut informasjon om hvert tegn uten å klikke på dem med selen.

Her kode til å klikke en etter en:

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

Prøv også uten ventetid, sannsynligvis vil fungere.

Svarte 05/09/2018 kl. 19:43
kilden bruker

stemmer
5

Jeg vet at du skrev at du ikke ønsker å bruke API, men å bruke selen for å få steder fra kartmarkører ser ikke ut som en god praksis, og du vil sannsynligvis ha problemer med det, i stedet, hvorfor ikke gjøre et kall til deres webtjeneste ved bruk av forespørsler og analysere den returnerte JSON?

Her er en fungerende script:

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)

selen

Hvis du fortsatt ønsker å gå på selen måte, i stedet for å vente til alle elementene er lastet, kan du bare stoppe script for noen sekunder eller et minutt å kontrollere at alt er lagt, bør dette løser timeout unntak:

import time 

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

For andre mulige løsninger, se den aksepterte svaret her: Gjør Selen vente 10 sekunder

Svarte 04/09/2018 kl. 07:33
kilden bruker

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