http://blog.csdn.net/fudax/article/details/8089404
今天用到日历控件,用第一个javascript执行后页面上的日期控件后,在html中可以看到生效日期的input中有value值了,但是页面的生效日期仍然显示空白,这时我在该页面,点提交后,页面会提示生效日期不能为空,也是就是实际上点提交时,还是判断了生效日期的value值是空的。
document.getElementById('EffectDate').removeAttribute('readOnly');document.getElementById('EffectDate').setAttribute('value','2014-04-26');
而试了网上的另一个javascript用法,用下面javascript解决了这个日期控件的输入:
document.getElementById('EffectDate').value='2014-04-27';
为咋上面的javascript不可以呢?
---这句中的[0],指document.getElementsByName返回的 是数组,表是找第一个Name,而ID是唯一性的。
2 * 通过javascript,根据日期控件的ID,设置日期值
3 * @param id
4 * @param date
5 */
6 public void dateTime(String id,String date){
7 // String jsStr="var dateTime=document.getElementById('"+id+"');"
8 // + "dateTime.removeAttribute('readOnly');"
9 // + "dateTime.setAttribute('value','"+date+"');";
10 // JavascriptExecutor js = (JavascriptExecutor) driver;
11 // js.executeScript(jsStr);
12
13 // String js="document.getElementById('"
14 // +id+"').removeAttribute('readOnly');document.getElementById('"
15 // +id+"').setAttribute('value','"
16 // +date+"');";
17
18 String js = "document.getElementById('" + id + "').value='" + date + "'";
19 ((JavascriptExecutor) driver).executeScript(js);
20 System.out.println(js);
21
22 }
------------------------------------------
网页上往往会有些输入域是readonly的,但是它的值又可以通过其他控件进行赋值,比如日历控件。这种可编辑域的输入通过selenium.type或者WebDriver.sendKeys都无法做到,但是我们可以考虑通过DOM赋值,下面仅以WebDriver为例,简单讲解一下如何做到。请注意,相关的被引用的对象和方法的声明请参见http://blog.csdn.net/fudax/article/details/7879910和http://blog.csdn.net/fudax/article/details/7879915这两个完整的工具类,整个工程的代码参见https://github.com/fudax/star-framework。
这里先讲一下document的几个getElement的方法:
1、 document.getElementById,由于ID是页面元素的唯一性标示属性,所以这种方法返回的元素是单个的。
2、 document.getElementsByName,与ID不同,Name不是唯一标示属性,所以返回的是一个对象数组,可以从字面上看出是getElements而不是getElement;
3、 document.getElementsByTagName,与getElementsByName原理相同。
了解了这三种方法,我们就可以通过执行JS去修改控件属性值了,可编辑域要输入的内容一般都是value属性,当然innertext也是可以的。具体方法如下:
- /**
- * readonly text box or richtext box input.
- *
- * @param by the attribute of the element, default support is TagName/Name/Id
- * @param byValue the attribute value of the element
- * @param text the text you want to input to element
- * @param index the index of the elements shared the same attribute value
- * @throws RuntimeException
- * @throws IllegalArgumentException
- */
- protected void sendKeysByDOM(String by, String byValue, String text, int index) {
- String js = null;
- boolean isSucceed = false;
- if (by.equalsIgnoreCase("tagname")) {
- js = "document.getElementsByTagName('" + byValue + "')[" + index + "].value='" + text + "'";
- } else if (by.equalsIgnoreCase("name")) {
- js = "document.getElementsByName('" + byValue + "')[" + index + "].value='" + text + "'";
- } else if (by.equalsIgnoreCase("id")) {
- js = "document.getElementById('" + byValue + "').value='" + text + "'";
- } else {
- throw new IllegalArgumentException("only can find element by TagName/Name/Id");
- }
- try {
- driver.executeScript(js);
- isSucceed = true;
- pass("input text [ " + text + " ] to element [ " + by + " ]...");
- } catch (WebDriverException e) {
- LOG.error(e);
- } catch (Exception e) {
- throw new RuntimeException(e.getMessage());
- }
- operationCheck(isSucceed);
- }
可以看得出这个测试方法有4个参数,使用起来不是很方便,我们可以继续重载出更简单实用的方法:
- /**
- * readonly text box or richtext box input, finding elements by element id.
- *
- * @param elementId the id of the element
- * @param text the text you want to input to element
- * @throws RuntimeException
- * @throws IllegalArgumentException
- */
- protected void sendKeysById(String elementId, String text) {
- sendKeysByDOM("Id", elementId, text, 0);
- }
- /**
- * readonly text box or richtext box input, finding elements by element name.
- *
- * @param elementName the name of the element
- * @param text the text you want to input to element
- * @param elementIndex the index of the elements shared the same name, begins with 0
- * @throws RuntimeException
- * @throws IllegalArgumentException
- */
- protected void sendKeysByName(String elementName, String text, int elementIndex) {
- sendKeysByDOM("Name", elementName, text, elementIndex);
- }
- /**
- * readonly text box or richtext box input, finding elements by element tag name.
- *
- * @param elementTagName the tag name of the element
- * @param text the text you want to input to element
- * @param elementIndex the index of the elements shared the same tag name, begins with 0
- * @throws RuntimeException
- * @throws IllegalArgumentException
- */
- protected void sendKeysByTagName(String elementTagName, String text, int elementIndex) {
- sendKeysByDOM("TagName", elementTagName, text, elementIndex);
- }