Java selenium - не удается выбрать дату во всплывающем календаре - PullRequest
0 голосов
/ 18 марта 2019

Я новичок в автоматизации с селеновым webdriver.Я пытаюсь забронировать рейс на сайте путешествия.(ryanair.com)

Я застреваю во всплывающем окне выбора даты.Я могу использовать .sendkeys только для ввода дня, после того, как какое-либо поле на вводе даты будет щелкнуто, всплывающий календарь появится так, что если формат ввода равен dd / mm / yyyy и я хочу ввести «20042019», он вводится только20 в дд, а затем автоматически выбирает текущий месяц и год для автозаполнения и открывает всплывающее окно календаря.

Я читал несколько статей, в которых говорилось, что эти календари обычно бывают двух типов: 1. iframe 2. datepicker - я думаю, что на ryanair есть datepickers, основанные на xpath ниже

//div[@id='datetimepicker_dateview']//table//tbody//td[not(contains(@class,'k-other-month')

Может быть, это неправильный xpath?Но я думаю, что это правильно

Я попытался найти список дат для бронирования, используя:

   List<WebElement> list_AllDateToBook = driver.findElements(By.xpath()
   System.out.println("size of list is : " + list_AllDateToBook.size() );
   System.out.println("list is : " + list_AllDateToBook );

Вывод: размер списка: 0 список: []

Когда я использую xpath для ввода даты в поле даты, оно работает для первого ввода, используя:

WebElement day = driver.findElement(By.xpath("//*[@id='row-dates-pax']/div[1]/div/div[1]/div/div[2]/div[2]/div/input[1]"));

Однако, когда я изменяю xpath на второй ввод, он не будет вводить второй ввод(месяц)

WebElement day = driver.findElement(By.xpath("//*[@id='row-dates-pax']/div[1]/div/div[1]/div/div[2]/div[2]/div/input[2]"));

Ниже приведен пример HTML-кода для выбора даты (слишком долго, чтобы добавить все это!)

   <core-datepicker class="start-date" default-date="" start-date="18-03-2019" end-date="28-03-2020" highlight-from="20-03-2019" highlight-to="20-04-2019" end-show="true" fly-out="true" value="dateRange.startDate" cb-event-id="cal-selector:select-start-date" unavailable-dates="dateRange.unavailabiltyStartDates" selected-month-view="dateRange.startDateSelectedMonthView" show-month-toggle="::dateRange.showMonthToggle" show-single-month=""><!----><div ng-class="::{'has-monthly-toggle': isMonthToggleVisible()}"><div bindonce="" class="datepicker-wrapper r scrollable value-selected" ng-class="{ scrollable: !device.isPhone(), mobile: device.isPhone(), 'value-selected': value, 'six-rows': checkIf6Rows()}" style="transition-timing-function: cubic-bezier(0.1, 0.57, 0.1, 1); transition-duration: 0ms; transform: translate(0px, 0px) translateZ(0px);"><!----><!----><ul ng-if="!device.isPhone()"><!----><li bindonce="" ng-repeat="i in _monthViews" ng-class="{ 'starting-month': checkIfIsSame(getDate(i), highlightFrom, 'month'), 'selected-month': checkIfIsSame(getDate(i), value, 'month'), 'highlight-on': canHighlight(i) }" class="calendar-view starting-month selected-month"><h1 class="month-name">March 2019</h1><ul class="week-days"><!---->

Я действительно застрял здесь.Любой совет будет отличным.

Спасибо

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

Вот рабочий код из python. Пожалуйста, ознакомьтесь с подходом, которому я следовал, и смоделируйте его в Java.

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


def get_full_path_to_folder(folderName):
    folders = os.path.abspath(os.pardir).split(os.sep)
    folderPath = ''
    for folder in folders:
        if folderPath == '':
            folderPath = folder
        else:
            folderPath = folderPath + "\\" +folder
        if os.path.isdir(os.path.join(folderPath, folderName)):
            return os.path.join(folderPath, folderName)
            break
def wait_for_element_present(locator_type, locator):
    if locator_type == 'xpath':
        return (wait.until(EC.presence_of_element_located((By.XPATH, locator))))
    elif locator_type == "css":
        return (wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, locator))))

chrome_options = ChromeOptions()
chrome_options.add_argument("--incognito")
driver = webdriver.Chrome(executable_path=os.path.join(get_full_path_to_folder('drivers'), "chromedriver.exe"))
driver.implicitly_wait(10)
wait = WebDriverWait(driver,10)
url = "https://www.ryanair.com/us/en/"
# go to url
driver.get(url)
#================ you should focus the below code=======================
# close the cookie pop up, otherwise the date and country elements not interable for selenium for interaction
wait_for_element_present('css',".cookie-popup__close").click()
#click on destination edit box
driver.find_element_by_css_selector(".route-selector-destination").click()
# select desitnation country
destiCountry = wait_for_element_present('xpath',"//div[@ng-repeat='option in $ctrl.firstOptions track by option.id' and text()=' Italy']")
destiCountry.click()
#select destination airport
desti = wait_for_element_present('xpath',"//span[contains(@ng-if,'secondOptionsEnabled') and .='Naples']")
desti.click()
# select outbound date
dateEle = wait_for_element_present('css',"li[data-id='24-03-2019']")
if dateEle.value_of_css_property('font-size') == '15px':
    dateEle.click()
#select in bound date
dateEle = wait_for_element_present('css',"li[data-id='20-04-2019']")
if dateEle.value_of_css_property('font-size') == '15px':
    dateEle.click()
#hurry, the date selection is successful.
0 голосов
/ 18 марта 2019

Пожалуйста, попробуйте с:

li[data-id='12-04-2019'] span

Примечание: добавить тег до пролета. Только что попробовал через консоль и работает.

document.querySelector("li[data-id='12-04-2019'] span").click()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...