Selenium webdriver 操作日历控件

一般的日期控件都是input标签下弹出来的,如果使用webdriver 去设置日期,

1. 定位到该input

2. 使用sendKeys 方法

比如:

但是,有的日期控件是readonly的

比如12306的这个

<input id="train_date" class="inp-txt" type="text" value="2015-03-15" name="back_train_date" autocomplete="off" maxlength="10" readonly="readonly" disabled="disabled">

这个时候,没法调用WebElement的sendKeys()

方案一:使用JS remove readonly attribute,然后sendKeys

还是以万恶的12306为例:

使用出发日期,将input标签的readonly熟悉去掉

         JavascriptExecutor removeAttribute = (JavascriptExecutor)driver;
         //remove readonly attribute
         removeAttribute.executeScript("var setDate=document.getElementById(\"train_date\");setDate.removeAttribute(‘readonly‘);") ;

方案二:采用click直接选择日期,日期控件是一个iframe,首先switch iframe,之后找到想要设置的日期button click,然后switch出来

WebElement dayElement=driver.findElement(By.xpath("//span[@id=‘from_imageClick‘]"));
dayElement.click();
// WebElement frameElement=driver.findElement(By.xpath("//iframe[@border=‘0‘]"));
driver.switchTo().frame(1);
driver.findElement(By.xpath("//tr/td[@onclick=‘day_Click(2015,2,21);‘]")).click();
driver.switchTo().defaultContent();

具体代码如下:

WebDriver driver=DriverFactory.getFirefoxDriver();
        driver.get("https://kyfw.12306.cn/otn/");
        driver.manage().window().maximize();
        driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);

         driver.manage().window().maximize();
         driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
         driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);

         WebElement fromStation=driver.findElement(By.xpath("//input[@id=‘fromStationText‘]"));
         fromStation.click();
         fromStation.sendKeys("郑州");
         WebElement choseFrom =driver.findElement(By.xpath("//div/span[@class=‘ralign‘ and text()=‘郑州‘]"));
         choseFrom.click();

         WebElement toStation=driver.findElement(By.xpath("//input[@id=‘toStationText‘]"));
         toStation.click();
         toStation.sendKeys("上海");
         WebElement choseElement =driver.findElement(By.xpath("//div/span[@class=‘ralign‘ and text()=‘上海‘]"));
         choseElement.click();
         JavascriptExecutor removeAttribute = (JavascriptExecutor)driver;
         //remove readonly attribute
         removeAttribute.executeScript("var setDate=document.getElementById(\"train_date\");setDate.removeAttribute(‘readonly‘);") ;
         WebElement setDatElement=driver.findElement(By.xpath("//input[@id=‘train_date‘]"));
         setDatElement.clear();
         setDatElement.sendKeys("2015-02-18");
         WebElement dayElement=driver.findElement(By.xpath("//span[@id=‘from_imageClick‘]"));
         dayElement.click();
        // WebElement frameElement=driver.findElement(By.xpath("//iframe[@border=‘0‘]"));
         driver.switchTo().frame(1);
         driver.findElement(By.xpath("//tr/td[@onclick=‘day_Click(2015,2,21);‘]")).click();
         driver.switchTo().defaultContent();
         WebElement searchElement=driver.findElement(By.xpath("//div/a[@id=‘a_search_ticket‘]"));
         searchElement.click();
     

其中:DriverFactory

package com.packt.webdriver.chapter3;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;

import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeDriverService;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.openqa.selenium.firefox.internal.ProfilesIni;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.os.WindowsUtils;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;

public class DriverFactory {

    public static WebDriver getHtmlUnit()
    {
        HtmlUnitDriver ht=new HtmlUnitDriver();
        return ht;
    }
    public static WebDriver getChromeDriver() {

        // TODO Auto-generated method stub
        String chromdriver="E:\\chromedriver.exe";
        System.setProperty("webdriver.chrome.driver", chromdriver);
        ChromeDriverService.Builder builder=new  ChromeDriverService.Builder();
        File file=new File(chromdriver);
//        int port=12643;
//        ChromeDriverService service=builder.usingDriverExecutable(file).usingPort(port).build();
//        try {
//            service.start();
//        } catch (IOException e) {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//        }
        ChromeOptions options = new ChromeOptions();
        options.addExtensions(new File(""));
        DesiredCapabilities capabilities = DesiredCapabilities.chrome();
        capabilities.setCapability("chrome.switches",
                Arrays.asList("--start-maximized"));
        options.addArguments("--test-type", "--start-maximized");
        WebDriver driver=new ChromeDriver(options);
        return driver;
    }
    public static WebDriver getFirefoxDriver()
    {
        try
        {
            WindowsUtils.tryToKillByName("firefox.exe");
        }
        catch(Exception e)
        {
            System.out.println("can not find firefox process");
        }
        File file=new File("d:\\firebug-2.0.4-fx.xpi");
        FirefoxProfile profile = new FirefoxProfile();
//        profile.setPreference("network.proxy.type", 2);
//        profile.setPreference("network.proxy.autoconfig_url", "http://proxy.successfactors.com:8083");
//        profile.setPreference("network.proxy.no_proxies_on", "localhost");
//        

//        profile.setPreference("network.proxy.http", "proxy.domain.example.com");
//        profile.setPreference("network.proxy.http_port", 8080);
//        profile.setPreference("network.proxy.ssl", "proxy.domain.example.com");
//        profile.setPreference("network.proxy.ssl_port", 8080);
//        profile.setPreference("network.proxy.ftp", "proxy.domain.example.com");
//        profile.setPreference("network.proxy.ftp_port", 8080);
//        profile.setPreference("network.proxy.socks", "proxy.domain.example.com");
//        profile.setPreference("network.proxy.socks_port", 8080);

        try {
            profile.addExtension(file);
            profile.setPreference("extensions.firebug.currentVersion", "2.0.4");
            profile.setPreference("extensions.firebug.allPagesActivation", "on");
        } catch (IOException e3) {
            // TODO Auto-generated catch block
            e3.printStackTrace();
        }

        WebDriver driver = new FirefoxDriver(profile);
        return driver;

    }
    public static WebDriver getIEDriver()
    {
        String IEDriverServer="E:\\IEDriverServer.exe";
        System.setProperty("webdriver.ie.driver",IEDriverServer);
        WebDriver driver=new InternetExplorerDriver();
        return driver;
    }

}

时间: 01-05

Selenium webdriver 操作日历控件的相关文章

Selenium webdriver 之select 控件封装,解决onchange问题

使用webdriver的时候,select 控件经常会绑定onchange 事件,在selenium2.09 之前click 方法对onchange 事件有bug,2.09 以后修复了,但是根据经验也遇到用selenium ui 下面的select的类去做select 操作,有时也可能不发触发onchange 事件,所以本人测试放弃不用,自己封装了几个好用的方法,在此分享,部分只要实现代码如下: /** * 获取选项列表 * * @return */ public List<WebElement

selenium - js日历控件处理

# 13. js处理日历控件 ''' 在web自动化的工程中,日历控制大约分为两种: 1. 可以直接输入日期 2. 通过日历控件选择日期 基本思路: 利用js去掉readonly属性,然后直接输入时间. ''' from selenium import webdriver driver = webdriver.Chrome() driver.get('https://www.12306.cn/index/') js_pha = 'document.getElementById("train_da

Java+Selenium——如何处理日历控件——方法二

有些web产品,网页上有一些时间选择,然后支持按照不同时间段范围去筛选数据.网页上日历控件一般,是一个文本输入框,鼠标点击, 就会弹出日历界面,可以选择具体日期.这篇,就是介绍用selenium如何自动化脚本实现. 先看一个完全模仿手工操作的场景,点击输入框,点击下一个月,再点击一个日子. package rjcs; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar;

selenium处理富文本框,日历控件等 调用JS修改value值

http://blog.csdn.net/fudax/article/details/8089404 document.getElementById("js_domestic_fromdate").value = "2014-10-10" selenium处理富文本框,日历控件等 调用JS修改value值,布布扣,bubuko.com

selenium学习之路之 处理日历控件

最近在研究selenium,碰到处理日期控件的问题,尝试数种方法均无果,最后终于找到一种可以成功的一种处理方式. 整个日历控制在div中: <input type="text" name="startDate" id="id_startdate1" size="15" maxlength="60" onfocus="assignValue('tr_attr_1');" onkeyd

关于日历控件My97DatePicker 在IE6下出现“无法打开站点,已终止操作”

今天项目测试,发现在IE6下一个页面打开失败,提示:"无法打开站点,已终止操作",测试了下发现是日历控件My97DatePicker 导致的错误,于是看了下My97DatePicker 的相关介绍,无果:最后无意间百度了下,还是找到了解决办法: 1.My97DatePicker 官方:http://www.my97.net 2.在IE6下出现"无法打开站点,已终止操作"的解决办法(转): My97DatePicker js 日期控件做的确实很优秀,但在ie6上显示最

VBA 添加日历控件的操作

近几天需要做一个VBA的宏,以方便在excel中选择格式化后日期,要求添加日历控件,并按照格式化进行输出,由于是第一次接触VBA,因此查询了一些资料,下面对自己所做的过程进行一下总结: 1.首先新建一个excel文档. 2.对excel文档添加添加日历控件,具体过程如下图: 插入其他控件中的日历控件,如下图: 添加完后如下图所示: 双击控件即可编写代码,代码如下 Private Sub Calendar1_Click() ActiveCell = Calendar1.Value        C

Selenium2+python自动化25-js处理日历控件(修改readonly属性)【转载】

前言 日历控件是web网站上经常会遇到的一个场景,有些输入框是可以直接输入日期的,有些不能,以我们经常抢票的12306网站为例,详细讲解如何解决日历控件为readonly属性的问题. 基本思路:先用js去掉readonly属性,然后直接输入日期文本内容 一.日历控件 1.打开12306的车票查询界面,在出发日期输入框无法直接输入时间 2.常规思路是点开日历控件弹出框,从日历控件上点日期,这样操作比较烦躁,并且我们测试的重点不在日历控件上,只是想输入个时间,做下一步的操作 3.用firebug查看

Selenium2+python自动化25-js处理日历控件(修改readonly属性)

本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/tag/js/ 前言 日历控件是web网站上经常会遇到的一个场景,有些输入框是可以直接输入日期的,有些不能,以我们经常抢票的12306网站为例,详细讲解如何解决日历控件为readonly属性的问题. 基本思路:先用js去掉readonly属性,然后直接输入日期文本内容 一.日历控件 1.打开12306的车票查询界面,在出发日期输入框无法直接输入时间 2.常规思路是点开日历控件弹出框,从日历控件