Невозможно нажать на знаки на карте

голоса
0

Я написал сценарий в питоне в сочетании с селеном , чтобы щелкнуть по каждому из признаков , имеющихся на карте. Тем не менее, когда я исполняю мой сценарий, он бросает timeout exceptionошибку при достижении этой линии wait.until(EC.staleness_of(item)).

Однако, прежде чем нажать эту строку, сценарий должен щелкнуть один раз, но он не мог? Как я могу нажать на все знаки в этой карте циклически?

Это ссылка на сайт

Это мой код до сих пор (возможно, я пытаюсь с неправильными селекторов):

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()
Задан 02/09/2018 в 05:42
источник пользователем
На других языках...                            


2 ответов

голоса
5

Вы можете щелкнуть по одному с помощью Selenium, если по каким-то причинам вы не можете использовать API. Также можно извлечь информацию для каждого знака, не нажимая на них с селеном.

Вот код, нажмите один за другим:

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

Попробуйте также без ожидания, вероятно, будет работать.

Ответил 05/09/2018 в 19:43
источник пользователем

голоса
5

Я знаю, что вы написали вы не хотите использовать API, но с использованием Selenium, чтобы получить места из маркеров карты не кажется хорошей практикой, и вы, вероятно, есть проблемы с ним, вместо этого, почему бы не сделать вызов их веб-службы с помощью запросов и разобрать возвращаемый JSON?

Вот рабочий сценарий:

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)

Селен

Если вы все еще хотите пойти Selenium путь, вместо того, чтобы ждать, пока не будут загружены все элементы, вы могли бы просто остановить скрипт на несколько секунд или даже минут, чтобы убедиться, что все загружается, то это должно исправить исключение тайм-аут:

import time 

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

Для других возможных путей их устранения, см принятый ответ здесь: Сделайте Селен подождите 10 секунд

Ответил 04/09/2018 в 07:33
источник пользователем

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