2014-01-29 2 views
8

В настоящее время работает над Selenium WebDriver и с использованием Java. Я хочу выбрать значения в date range из раскрывающегося списка. Я хочу знать, как я могу выбрать значения, как Date, Month and year в списке выбора даты.Как выбрать выбор даты в селене WebDriver

Вот HTML тег:

<dd id="date-element"> 
<input id="fromDate" class="hasDatepicker" type="text" style="width:57px; padding:3px 1px; font-size:11px;" readonly="readonly" name="fromDate" value="01 Jan 2013"> 

<input id="toDate" class="hasDatepicker" type="text" style="width:57px; padding:3px 1px; font-size:11px;" readonly="readonly" name="toDate" value="31 Dec 2013"> 

enter image description here

Ниже пример кода я попытался:

Log.info("Clicking on From daterange dropdown"); 
JavascriptExecutor executor8 = (JavascriptExecutor)driver; 
executor8.executeScript("document.getElementById('fromDate').style.display='block';"); 
Select select8 = new Select(driver.findElement(By.id("fromDate"))); 
select8.selectByVisibleText("10 Jan 2013"); 
Thread.sleep(3000); 

Log.info("Clicking on To daterange dropdown"); 
JavascriptExecutor executor10 = (JavascriptExecutor)driver; 
executor10.executeScript("document.getElementById('toDate').style.display='block';"); 
Select select10 = new Select(driver.findElement(By.id("toDate"))); 
select10.selectByVisibleText("31 Dec 2013"); 
Thread.sleep(3000); 
+0

что вы пробовали? –

+0

Даты не являются элементами 'Select'. Они действительно таблицы –

+0

Посмотрите на мой ответ. –

ответ

9

DatePicker не Select элемент. Что вы делаете в своем коде неправильно.

Datepicker - это фактически таблица с набором строк и столбцов. Чтобы выбрать дату, вам просто нужно перейти к ячейке, где присутствует наша желаемая дата.

Так что ваш код должен быть таким:

WebElement dateWidget = driver.findElement(your locator); 
List<WebElement> columns=dateWidget.findElements(By.tagName("td")); 

for (WebElement cell: columns){ 
    //Select 13th Date 
    if (cell.getText().equals("13")){ 
     cell.findElement(By.linkText("13")).click(); 
     break; 
} 
+0

@ Муравей вы говорите только, чтобы щелкнуть дату, но я не весь сборщик в течение месяца и года также .. не могли бы вы привести мне еще несколько примеров. – Amirdha

+0

Разве это не нужно, чтобы использовать как @ Ant? Список columns = (Список ) dateWidget.findElements (By.tagName ("td")); – hirosht

+0

@hirosht: Зачем бросать? –

5

Вы не можете попробовать это, увидеть, если он работает для вас.

Вместо того, чтобы выбирать дату из даты, вы можете включить поле даты, используя javascript &, введите нужную дату, это позволит избежать чрезмерного времени, необходимого для прохождения по всем элементам даты до тех пор, пока вы не достигнете того, которое вам нужно выбрать.

Код для с даты

((JavascriptExecutor)driver).executeScript ("document.getElementById('fromDate').removeAttribute('readonly',0);"); // Enables the from date box 

WebElement fromDateBox= driver.findElement(By.id("fromDate")); 
fromDateBox.clear(); 
fromDateBox.sendKeys("8-Dec-2014"); //Enter date in required format 

Код для датировать

((JavascriptExecutor)driver).executeScript ("document.getElementById('toDate').removeAttribute('readonly',0);"); // Enables the from date box 

WebElement toDateBox= driver.findElement(By.id("toDate")); 
toDateBox.clear(); 
toDateBox.sendKeys("15-Dec-2014"); //Enter date in required format 
+0

Это прекрасно работает, хотя для автоматизации это неэтично, так как поведение взаимодействия с пользователями. – hirosht

1

попытаться SendKeys вместо того, чтобы выбрать дату

driver.FindElement(yourBy).SendKeys(yourDateTime.ToString("ddd, dd.MM.yyyy",CultureInfo.CreateSpecificCulture("en-US"))); 

Если это не сработает, попробуйте отправить адаптивную вкладку "

element.SendKeys(OpenQA.Selenium.Keys.Tab); 
+0

Знаешь что? Это то, что я в конечном итоге делаю, так или иначе, когда я использую Selenium для тестирования с Chromedriver, у моего электронного приложения с выбором даты не было всех тегов даты, хотя он отображается, поэтому мне приходится отправлять входы с помощью sendKeys в любом случае. –

0
public String datePicker(String object,String data){ 
    APP_LOGS.debug("selecting date"); 
    try{ 

     WebElement dateWidget = driver.findElement(By.xpath(OR.getProperty(object))); 

     List<WebElement> rows = dateWidget.findElements(By.tagName("tr")); 
     List<WebElement> columns = dateWidget.findElements(By.tagName("td")); 

     for (WebElement cell: columns){ 
      if (cell.getText().equals(data)){ 
       cell.findElement(By.linkText(data)).click(); 
       break; 
      } 
     } 
    }catch(Exception e){ 
     return Constants.KEYWORD_FAIL+" -- Not able to select the date"+e.getMessage(); 
    } 
    return Constants.KEYWORD_PASS; 
} 
2

Я думаю, что это может быть сделано намного более простым способом:

  1. Найти локатор для месяца (использовать Firebug/Firepath)
  2. Это, вероятно, выбрать элемент, используйте Селен, чтобы выбрать месяц
  3. Сделайте то же самое для года
  4. Нажмите на LinkText «31» или любой другой дату вы хотите нажать

Так код будет выглядеть примерно так:

WebElement month = driver.findElement(month combo locator); 
Select monthCombo = new Select(month); 
monthCombo.selectByVisibleText("March"); 

WebElement year = driver.findElement(year combo locator); 
Select yearCombo = new Select(year); 
yearCombo.selectByVisibleText("2015"); 

driver.click(By.linkText("31")); 

Это не будет работать, если выбор даты выпадающие не выбрать, но большинство из тех, которые я видел отдельные элементы (выберите, ссылка и т.д.)

0

Вы можете непосредственно использовать следующий код JavaScript

((JavascriptExecutor)driver).executeScript("document.getElementById('fromDate').setAttribute('value','10 Jan 2013')") 
0

не Инджу ct javascript. Это плохая практика.

Я бы смоделировал DatePicker как элемент, например textbox/select, как показано ниже.

Для детального ответа - чек здесь- http://www.testautomationguru.com/selenium-webdriver-automating-custom-controls-datepicker/

public class DatePicker { 

    private static final String dateFormat = "dd MMM yyyy"; 

    @FindBy(css = "a.ui-datepicker-prev") 
    private WebElement prev; 

    @FindBy(css = "a.ui-datepicker-next") 
    private WebElement next; 

    @FindBy(css = "div.ui-datepicker-title") 
    private WebElement curDate; 

    @FindBy(css = "a.ui-state-default") 
    private List <WebElement> dates; 

    public void setDate(String date) { 

     long diff = this.getDateDifferenceInMonths(date); 
     int day = this.getDay(date); 

     WebElement arrow = diff >= 0 ? next : prev; 
     diff = Math.abs(diff); 

     //click the arrows 
     for (int i = 0; i < diff; i++) 
      arrow.click(); 

     //select the date 
     dates.stream() 
      .filter(ele - > Integer.parseInt(ele.getText()) == day) 
      .findFirst() 
      .ifPresent(ele - > ele.click()); 

    } 

    private int getDay(String date) { 
     DateTimeFormatter dtf = DateTimeFormatter.ofPattern(dateFormat); 
     LocalDate dpToDate = LocalDate.parse(date, dtf); 
     return dpToDate.getDayOfMonth(); 
    } 

    private long getDateDifferenceInMonths(String date) { 
     DateTimeFormatter dtf = DateTimeFormatter.ofPattern(dateFormat); 
     LocalDate dpCurDate = LocalDate.parse("01 " + this.getCurrentMonthFromDatePicker(), dtf); 
     LocalDate dpToDate = LocalDate.parse(date, dtf); 
     return YearMonth.from(dpCurDate).until(dpToDate, ChronoUnit.MONTHS); 
    } 

    private String getCurrentMonthFromDatePicker() { 
     return this.curDate.getText(); 
    } 

} 
Смежные вопросы