首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Selenium :如何从数据采集器中选择下一个可用日期

Selenium :如何从数据采集器中选择下一个可用日期
EN

Stack Overflow用户
提问于 2011-12-04 17:35:51
回答 3查看 4.9K关注 0票数 7

我希望我的selenium IDE测试用例像下面的步骤那样运行,以便自动选择日期:

  • 单击“离开日期”打开“数据转发器”。
  • 从当前选定的日期开始,循环遍历日期直到到达下一个可用日期(如果需要,请移动到下一个月或年份以找到下一个可用日期)
  • 从数据采集器中选择可用日期。

有人能告诉我,我是selenium的新手,如何在上面的例子中做到这一点吗?我的脚本现在能做的就是打开日历。

下面是我收到的与上面的截图相匹配的html:

代码语言:javascript
运行
复制
//Months drop down
    <select class="ui-datepicker-month" data-handler="selectMonth" data-event="change">
    <option value="2" selected="selected">Mar
    </option><option value="3">Apr</option>
    <option value="4">May</option>
    <option value="5">Jun</option>
    <option value="6">Jul</option>
    <option value="7">Aug</option>
    <option value="8">Sep</option>
    <option value="9">Oct</option>
    </select>
//Years drop down
    <select class="ui-datepicker-year" data-handler="selectYear" data-event="change">
    <option value="2016" selected="selected">2016</option>
    </select>
    <table class="ui-datepicker-calendar">
//days labels
    <thead>
    <tr>
    <th scope="col"><span title="Monday">Mo</span></th>
    <th scope="col"><span title="Tuesday">Tu</span></th>
    <th scope="col"><span title="Wednesday">We</span></th>
    <th scope="col"><span title="Thursday">Th</span></th>
    <th scope="col"><span title="Friday">Fr</span></th>
    <th scope="col" class="ui-datepicker-week-end"><span title="Saturday">Sa</span></th>
    <th scope="col" class="ui-datepicker-week-end"><span title="Sunday">Su</span></th>
    </tr>
    </thead>
    <tbody>
//dates
    <tr>
    <td class=" ui-datepicker-other-month ui-datepicker-unselectable ui-state-disabled">&nbsp;</td>
    <td class=" ui-datepicker-unselectable ui-state-disabled " title="No available flights on this date"><span class="ui-state-default">1</span></td>
    <td class=" ui-datepicker-unselectable ui-state-disabled " title="No available flights on this date"><span class="ui-state-default">2</span></td>
    <td class=" ui-datepicker-unselectable ui-state-disabled " title="No available flights on this date"><span class="ui-state-default">3</span></td>
    <td class=" ui-datepicker-unselectable ui-state-disabled " title="No available flights on this date"><span class="ui-state-default">4</span></td>
    <td class=" ui-datepicker-week-end ui-datepicker-unselectable ui-state-disabled " title="No available flights on this date"><span class="ui-state-default">5</span></td>
    <td class=" ui-datepicker-week-end ui-datepicker-unselectable ui-state-disabled " title="No available flights on this date"><span class="ui-state-default">6</span></td></tr>
    <tr>
    <td class=" ui-datepicker-unselectable ui-state-disabled " title="No available flights on this date"><span class="ui-state-default">7</span></td>
    <td class=" ui-datepicker-unselectable ui-state-disabled " title="No available flights on this date"><span class="ui-state-default">8</span></td>
    ...same process till last week of dates (bottom row of calendar in screenshot)
    <tr>
    <td class=" ui-datepicker-days-cell-over  ui-datepicker-current-day" title="Click to see flights on this date" data-handler="selectDay" data-event="click" data-month="2" data-year="2016"><a class="ui-state-default ui-state-active" href="#">28</a></td>
    <td class=" ui-datepicker-unselectable ui-state-disabled " title="No available flights on this date"><span class="ui-state-default">29</span></td>
    <td class=" ui-datepicker-unselectable ui-state-disabled " title="No available flights on this date"><span class="ui-state-default">30</span></td>
    <td class=" ui-datepicker-unselectable ui-state-disabled " title="No available flights on this date"><span class="ui-state-default">31</span></td>
    <td class=" ui-datepicker-other-month ui-datepicker-unselectable ui-state-disabled">&nbsp;</td><td class=" ui-datepicker-week-end ui-datepicker-other-month ui-datepicker-unselectable ui-state-disabled">&nbsp;</td>
    <td class=" ui-datepicker-week-end ui-datepicker-other-month ui-datepicker-unselectable ui-state-disabled">&nbsp;</td>
    </tr>
    </tbody>
    </table>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-06 16:42:10

在Selenium中自动化这样的任务将是相当困难的,因为获取下一个可用日期涉及到一个重要的逻辑,因此您应该考虑切换到硒WebDriver选择可用的selenium语言绑定之一。

下面是使用Python语言Selenium绑定编写的工作代码。其想法是:

  • 实例化WebDriver (在本例中使用Firefox(),但也有其他选择)
  • 最大化浏览器窗口
  • 导航到URL (http://www.jet2.com)
  • 等待页面显式加载(文档)
  • 填写出发和目的地字段
  • 单击"Depart“字段以触发要显示的日历
  • 在日历中,找到当前日期-它有ui-datepicker-current-day类。
  • 检查这个月是否有可用的日期,使用"by XPath“定位技术和轴心。如果是,请打印出来并单击。
  • 如果我们没有在这个月中找到下一个可用的日期,初始化和“无止境”循环,然后单击“下一个”月份按钮检查是否有可用的日期。打印出来,单击如果找到并退出循环。否则,单击“下一步”按钮。
  • 如果我们没有“下一步”按钮-那么我们是在年底,选择下一年在年度下拉,继续循环。
  • 完成时关闭驱动程序

“守则”:

代码语言:javascript
运行
复制
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


FROM = "Leeds Bradford"
TO = "Budapest BUD"

driver = webdriver.Firefox()  # or, webdriver.Chrome(), or webdriver.PhantomJS() or etc.
driver.maximize_window()
driver.get("http://www.jet2.com")

wait = WebDriverWait(driver, 10)
actions = ActionChains(driver)

# wait for the page to load
wait.until(EC.presence_of_element_located((By.ID, "departure-airport-input")))

# fill out the form
driver.find_element_by_id("departure-airport-input").send_keys(FROM)
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#ui-id-1 .ui-menu-item"))).click()

driver.find_element_by_id("destination-airport-input").send_keys(TO)
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#ui-id-2 .ui-menu-item"))).click()

# select date
datepicker = driver.find_element_by_id("departure-date-selector")
actions.move_to_element(datepicker).click().perform()

# find the calendar, month and year picker and the current date
calendar = driver.find_element_by_id("departureDateContainer")
month_picker = Select(calendar.find_element_by_class_name("ui-datepicker-month"))
year_picker = Select(calendar.find_element_by_class_name("ui-datepicker-year"))
current_date = calendar.find_element_by_class_name("ui-datepicker-current-day")

# printing out current date
month = month_picker.first_selected_option.text
year = year_picker.first_selected_option.text
print("Current date: {day} {month} {year}".format(day=current_date.text, month=month, year=year))

try:
    # see if we have an available date in this month
    next_available_date = current_date.find_element_by_xpath("following::td[@data-handler='selectDay' and ancestor::div/@id='departureDateContainer']")
    print("Found an available date: {day} {month} {year}".format(day=next_available_date.text, month=month, year=year))
    next_available_date.click()
except NoSuchElementException:
    # looping over until the next available date found
    while True:
        # click next, if not found, select the next year
        try:
            calendar.find_element_by_class_name("ui-datepicker-next").click()
        except NoSuchElementException:
            # select next year
            year = Select(calendar.find_element_by_class_name("ui-datepicker-year"))
            year.select_by_visible_text(str(int(year.first_selected_option.text) + 1))

        # reporting current processed month and year
        month = Select(calendar.find_element_by_class_name("ui-datepicker-month")).first_selected_option.text
        year = Select(calendar.find_element_by_class_name("ui-datepicker-year")).first_selected_option.text
        print("Processing {month} {year}".format(month=month, year=year))

        try:
            next_available_date = calendar.find_element_by_xpath(".//td[@data-handler='selectDay']")
            print("Found an available date: {day} {month} {year}".format(day=next_available_date.text, month=month, year=year))
            next_available_date.click()
            break
        except NoSuchElementException:
            continue

driver.close()

测试结果:

  • 利兹·布拉德福德-> Antalya AYT (下次日期为4月份): 当前日期:2016年3月28日
  • 利兹·布拉德福德-布达佩斯花蕾(下一个日期为当月): 当前日期:2016年2月12日发现可用日期:2016年2月15日
  • ?(下一年的下一个可用日期)
票数 5
EN

Stack Overflow用户

发布于 2016-02-06 23:50:14

通过Selenium来实现这一点是很有挑战性的。参考链接这里,看看gotoIF是如何工作的。从这里下载用户扩展js并添加到selenium中。如果您可以使用Selenium驱动程序,那么您将很容易实现它。

下面的示例是通过Selenium完成的。我只举了一个例子来选择出站航班。在这两种情况下,我首先发送的网址与今天的日期作为出发日期和到达日期。然后使用gotoIf选择出站的第一个可用日期。

示例1:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head profile="http://selenium-ide.openqa.org/profiles/test-case">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="selenium.base" href="http://www.jet2.com/" />
<title>21jet2_01</title>
</head>
<body>
<table cellpadding="1" cellspacing="1" border="1">
<thead>
<tr><td rowspan="1" colspan="3">21jet2_01</td></tr>
</thead><tbody>
<tr>
    <td>open</td>
    <td>/cheap-flights/leeds-bradford/larnaca/2016-02-07/2016-02-07?adults=2</td>
    <td></td>
</tr>
<tr>
    <td>storeElementPresent</td>
    <td>xpath=//div[@class='monthview outbound ']/div[2]/table/tbody/tr/td[starts-with(@class, &quot;LS1FlightDay flights&quot;)]/a/div/span[@class='fare']</td>
    <td>x</td>
</tr>
<tr>
    <td>gotoIf</td>
    <td>${x} == true</td>
    <td>select</td>
</tr>
<tr>
    <td>label</td>
    <td>clickNextMonth</td>
    <td></td>
</tr>
<tr>
    <td>clickAndWait</td>
    <td>xpath=//div[@class='monthview outbound ']/div/div[2]/a[@class='changepage nextmonth icon icon-arrow-next']</td>
    <td></td>
</tr>
<tr>
    <td>storeElementPresent</td>
    <td>xpath=//div[@class='monthview outbound ']/div[2]/table/tbody/tr/td[starts-with(@class, &quot;LS1FlightDay flights&quot;)]/a/div/span[@class='fare']</td>
    <td>y</td>
</tr>
<tr>
    <td>gotoIf</td>
    <td>${y} == false</td>
    <td>clickNextMonth</td>
</tr>
<tr>
    <td>label</td>
    <td>select</td>
    <td></td>
</tr>
<tr>
    <td>click</td>
    <td>xpath=//div[@class='monthview outbound ']/div[2]/table/tbody/tr/td[starts-with(@class, &quot;LS1FlightDay flights&quot;)]/a/div/span[@class='fare']</td>
    <td></td>
</tr>
</tbody></table>
</body>
</html>

示例2:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head profile="http://selenium-ide.openqa.org/profiles/test-case">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="selenium.base" href="http://www.jet2.com/" />
<title>21jet2_01</title>
</head>
<body>
<table cellpadding="1" cellspacing="1" border="1">
<thead>
<tr><td rowspan="1" colspan="3">21jet2_01</td></tr>
</thead><tbody>
<tr>
    <td>open</td>
    <td>/cheap-flights/belfast/alicante/2016-02-07/2016-02-07?adults=2</td>
    <td></td>
</tr>
<tr>
    <td>storeElementPresent</td>
    <td>xpath=//div[@class='monthview outbound ']/div[2]/table/tbody/tr/td[starts-with(@class, &quot;LS1FlightDay flights&quot;)]/a/div/span[@class='fare']</td>
    <td>x</td>
</tr>
<tr>
    <td>gotoIf</td>
    <td>${x} == true</td>
    <td>select</td>
</tr>
<tr>
    <td>label</td>
    <td>clickNextMonth</td>
    <td></td>
</tr>
<tr>
    <td>clickAndWait</td>
    <td>xpath=//div[@class='monthview outbound ']/div/div[2]/a[@class='changepage nextmonth icon icon-arrow-next']</td>
    <td></td>
</tr>
<tr>
    <td>storeElementPresent</td>
    <td>xpath=//div[@class='monthview outbound ']/div[2]/table/tbody/tr/td[starts-with(@class, &quot;LS1FlightDay flights&quot;)]/a/div/span[@class='fare']</td>
    <td>y</td>
</tr>
<tr>
    <td>gotoIf</td>
    <td>${y} == false</td>
    <td>clickNextMonth</td>
</tr>
<tr>
    <td>label</td>
    <td>select</td>
    <td></td>
</tr>
<tr>
    <td>click</td>
    <td>xpath=//div[@class='monthview outbound ']/div[2]/table/tbody/tr/td[starts-with(@class, &quot;LS1FlightDay flights&quot;)]/a/div/span[@class='fare']</td>
    <td></td>
</tr>
</tbody></table>
</body>
</html>
票数 1
EN

Stack Overflow用户

发布于 2016-02-06 17:56:20

这是Java版本。

代码语言:javascript
运行
复制
import java.util.List;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;

public class DatePicketJet2 {
    public static WebDriver browser;

    public static void main(String args[]) throws InterruptedException {

        browser = new FirefoxDriver();
        String url = "http://www.jet2.com/";

        browser.get(url);
        browser.manage().window().maximize();

        browser.findElement(By.id("departureAirportList")).click();  
        WebElement departureCountry = browser.findElement(By.id("destinations-uk"));
        WebElement departureCityLocator = departureCountry.findElement(By.tagName("ul"));
        List<WebElement> departureCities = departureCityLocator.findElements(By.tagName("li"));
        /*
        for (WebElement we : departureCities) {
            System.out.println(we.getText());
        }
        */
        departureCities.get(1).click();

        browser.findElement(By.id("destinationAirportList")).click();  

        WebElement destinationCountry = browser.findElement(By.id("destinations-country"));
        WebElement destinationCityLocator = destinationCountry.findElement(By.tagName("ul"));
        List<WebElement> destinationCities = destinationCityLocator.findElements(By.tagName("li"));
        /*
        for (WebElement we : destinationCities) {
            System.out.println(we.getText());
        }
        */
        destinationCities.get(1).click();

        browser.findElement(By.id("departure-date-selector")).click();

        WebElement departureMonth = browser.findElement(By.tagName("tbody"));
        //System.out.println(departureMonth.getText());
        List<WebElement> departureDate = departureMonth.findElements(By.tagName("a"));
        for (WebElement we : departureDate) {
            System.out.println("~" + we.getText());
            we.click();
            break;
        }

        browser.findElement(By.id("return-date-selector")).click();
        Thread.sleep(1000);
        WebElement returnMonth = browser.findElement(By.tagName("tbody"));
        System.out.println("<>" + returnMonth.isEnabled());
        System.out.println(returnMonth.getText());
        List<WebElement> returnDate = returnMonth.findElements(By.tagName("a"));
        for (WebElement we1 : returnDate) {
            System.out.println("~" + we1.getText());
            we1.click();
            break;
        }
        Thread.sleep(1000);
        browser.close();
    }
}

请注意<tbody>,并使用名称作为"a“标记查找所有可见日期,您将得到所有可行的日期或以绿色显示的日期。

稍后,根据您的需求改进您的逻辑。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8377188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档