Селен не щелкающий элемент, когда в цикле - PullRequest
0 голосов
/ 31 октября 2019

Код работает сам по себе, но при броске в цикл он больше не работает.

driver.get("https://www.esky.pl/okazje/16578/WMI-EDI-FR")
i = 1
departure_date_clickable = False
while departure_date_clickable == False:
    try:
        time.sleep(5)
        xpath ="/html/body/div[4]/div[3]/div/div[1]/div[1]/div[2]/div/div[4]/div/div[{}]".format(i)
        find_ele = driver.find_element_by_xpath(xpath)
        find_ele.click()
        print("Departure:Found clickable date on " + str(i))
        departure_date_clickable = True
    except WebDriverException:
        print("Departure date not clickable, checking next day")
        i += 1
        continue

Я ожидаю щелкнуть первый элемент, который можно щелкнуть в календаре. Но по какой-то причине это проблема для селена в цикле.

Код работает:

xpath = "/html/body/div[4]/div[3]/div/div[1]/div[1]/div[2]/div/div[4]/div/div[{}]".format("4")
find_ele = driver.find_element_by_xpath(xpath)
time.sleep(2)
find_ele.click()

Ответы [ 4 ]

1 голос
/ 31 октября 2019

Пожалуйста, найдите решение ниже, при просмотре элемента списка наблюдается несколько проблем. Примите к сведению, что если вы хотите выбрать конкретную дату отъезда, вам необходимо включить это условие в цикл for. На данный момент, согласно вашему коду, мы просто нажимаем все даты отъезда

from selenium.common.exceptions import WebDriverException
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.support.ui import WebDriverWait as Wait
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome('C:\New folder\chromedriver.exe')

driver.maximize_window()

driver.get("https://www.esky.pl/okazje/16578/WMI-EDI-FR")
i = 1
departure_date_clickable = False
while departure_date_clickable == False:
    try:

        xpath = WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located((By.XPATH, "//div[@id='departure-calendar']//div[@class='month-days']/div/div")))
        for value in xpath:
            value.click()
            departure_date_clickable = True


    except WebDriverException:
1 голос
/ 31 октября 2019

Я рекомендую идентифицировать кликабельные элементы div по атрибуту класса, уникальному для этих элементов div. Похоже, что все «кликабельные» ссылки имеют класс «offer», так что вы можете добавить условие if else, чтобы проверить каждый элемент для этого класса. Я также добавил условие завершения в ваш цикл, поскольку в блоке 35 делений.

driver.get("https://www.esky.pl/okazje/16578/WMI-EDI-FR")
i = 1
departure_date_clickable = False
while departure_date_clickable == False and i <= 35:
    try:
        time.sleep(1)
        xpath ="/html/body/div[4]/div[3]/div/div[1]/div[1]/div[2]/div/div[4]/div/div[{}]".format(i)
        find_ele = driver.find_element_by_xpath(xpath)
        if "offer" in find_ele.get_attribute("class").split(" "):
            find_ele.click()
            print("Departure:Found clickable date on " + str(i))
            departure_date_clickable = True
        else:
            raise error()
    except:
        print("Departure date not clickable, checking next day")
        i += 1
        continue
0 голосов
/ 31 октября 2019

Вы можете получить все дни отъезда с предложением, используя:

driver.find_elements_by_css_selector("#departure-calendar .cell-day.number.offer")

Для календаря прибытия:

driver.find_elements_by_css_selector("#arrival-calendar .cell-day.number.offer")

Код ниже нажмите на каждый день с предложением в календаре отъезда и напечатайте дату:

driver.get("https://www.esky.pl/okazje/16578/WMI-EDI-FR")

departure_days = driver.find_elements_by_css_selector("#departure-calendar .cell-day.number.offer")

for departure_day in departure_days:
    departure_day.click()
    # print selected date
    print(departure_day.get_attribute("data-qa-date"))
0 голосов
/ 31 октября 2019

Если вы просто ищете первую доступную дату, вы можете использовать селектор CSS ниже

div.cell-day.offer

Ваш код будет выглядеть как

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

driver.get("https://www.esky.pl/okazje/16578/WMI-EDI-FR")
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.cell-day.offer"))).click()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...