package org.sky.auto.element; import org.apache.log4j.Logger; import org.openqa.selenium.By; import org.openqa.selenium.Dimension; import org.openqa.selenium.Keys; import org.openqa.selenium.NoSuchElementException; import org.openqa.selenium.Point; import org.openqa.selenium.WebElement; import org.openqa.selenium.remote.RemoteWebElement; import org.sky.auto.base.AutoBase; import org.sky.auto.exception.MyAutoException; import org.sky.auto.proxy.ProxyRunnerListener; //import org.sky.auto.log.MyLogger; import org.sky.auto.window.Window; /**这个Element类是一个辅助操作的类,可以混用的一个类型,里面定义了常用的元素方法,这样的话可以节约自己封装了<br> * 这个element类不支持HtmlUnit的元素定义 * @author 王天庆 * */ public class SElement{ Logger logger = Logger.getLogger(SElement.class); WebElement element; /**元素说明*/ private String id="Element"; public SElement(WebElement element){ this.element=element; } /**构造方法,通过By的方式来构造Element元素*/ public SElement(By by){ this.element=AutoBase.driver().findElement(by); } /**最常用的Element的构造方法*/ public SElement(){ this.element=new RemoteWebElement(); } public WebElement getElement() { return element; } public void setElement(WebElement element) { this.element = element; } public SElement addLocator(By by){ this.element=AutoBase.driver().findElement(by); return this; } public SElement addLocator(WebElement element){ this.element=element; return this; } public SElement addLocator(Locator locator,String value){ ProxyRunnerListener.getDispatcher().beforeaddLocator(); switch(locator){ case Id: this.element=AutoBase.driver().findElement(By.id(value)); ProxyRunnerListener.getDispatcher().afteraddLocator(); break; case Xpath: this.element=AutoBase.driver().findElement(By.xpath(value)); ProxyRunnerListener.getDispatcher().afteraddLocator(); break; case LinkText: this.element=AutoBase.driver().findElement(By.linkText(value)); ProxyRunnerListener.getDispatcher().afteraddLocator(); break; case PartialLinkText: this.element=AutoBase.driver().findElement(By.partialLinkText(value)); ProxyRunnerListener.getDispatcher().afteraddLocator(); break; case TagName: this.element=AutoBase.driver().findElement(By.tagName(value)); ProxyRunnerListener.getDispatcher().afteraddLocator(); break; case Class: this.element=AutoBase.driver().findElement(By.className(value)); ProxyRunnerListener.getDispatcher().afteraddLocator(); break; case Css: this.element=AutoBase.driver().findElement(By.cssSelector(value)); ProxyRunnerListener.getDispatcher().afteraddLocator(); break; case Name: this.element=AutoBase.driver().findElement(By.name(value)); ProxyRunnerListener.getDispatcher().afteraddLocator(); break; default: logger.error("定位方式选择错误!没有加入成功!"); throw new MyAutoException("选择的定位方式不支持!"); } return this; } public SElement addLocator(Locator locator,String value, int index){ ProxyRunnerListener.getDispatcher().beforeaddLocator(); switch(locator){ case Id: this.element=AutoBase.driver().findElements(By.id(value)).get(index); ProxyRunnerListener.getDispatcher().afteraddLocator(); break; case Xpath: this.element=AutoBase.driver().findElements(By.xpath(value)).get(index); ProxyRunnerListener.getDispatcher().afteraddLocator(); break; case LinkText: this.element=AutoBase.driver().findElements(By.linkText(value)).get(index); ProxyRunnerListener.getDispatcher().afteraddLocator(); break; case PartialLinkText: this.element=AutoBase.driver().findElements(By.partialLinkText(value)).get(index); ProxyRunnerListener.getDispatcher().afteraddLocator(); break; case TagName: this.element=AutoBase.driver().findElements(By.tagName(value)).get(index); ProxyRunnerListener.getDispatcher().afteraddLocator(); break; case Class: this.element=AutoBase.driver().findElements(By.className(value)).get(index); ProxyRunnerListener.getDispatcher().afteraddLocator(); break; case Css: this.element=AutoBase.driver().findElements(By.cssSelector(value)).get(index); ProxyRunnerListener.getDispatcher().afteraddLocator(); break; case Name: this.element=AutoBase.driver().findElements(By.name(value)).get(index); ProxyRunnerListener.getDispatcher().afteraddLocator(); break; default: logger.error("定位方式选择错误!没有加入成功!"); throw new MyAutoException("选择的定位方式不支持!"); } if(element==null){ throw new NoSuchElementException("在定位元素的时候发生了错误,很有可能是元素没有定位到!请检查自己配置的元素定位方式是否正确!"); } return this; } public SElement addLocator(By by,int index){ ProxyRunnerListener.getDispatcher().beforeaddLocator(); this.element=AutoBase.driver().findElements(by).get(index); ProxyRunnerListener.getDispatcher().afteraddLocator(); return this; } /**点击操作*/ public void click(){ Window.updateWindow(); ProxyRunnerListener.getDispatcher().beforeClickOn(); if(isExist()){ getElement().click(); logger.info(">>["+this.getId()+"]点击成功!"); }else{ logger.error(">>没有找到元素,点击失败!"); throw new MyAutoException("["+this.getId()+"]进行点击操作的时候出现错误!"); } ProxyRunnerListener.getDispatcher().afterClickOn(); } /**清除操作*/ public void clear(){ Window.updateWindow(); ProxyRunnerListener.getDispatcher().beforeclear(); if(isExist()){ getElement().clear(); logger.info(">>["+this.getId()+"]输入框内容清理成功!"); }else{ logger.error(">>输入框内容清理失败!没有找到元素!"); throw new MyAutoException("["+this.getId()+"]清理输入框失败!没有找到元素!"); } ProxyRunnerListener.getDispatcher().afterclear(); } /**双击操作*/ public void doubleClick(){ Window.updateWindow(); ProxyRunnerListener.getDispatcher().beforedoubleClick(); if(isExist()){ AutoBase.doubleClick(getElement()); logger.info(">>["+this.getId()+"]双击成功!"); }else{ logger.error(">>双击失败!没有找到元素!"); throw new MyAutoException("["+this.getId()+"]进行双击操作的时候失败!很有可能的原因是自己定义的元素没有被找到元素!"); } ProxyRunnerListener.getDispatcher().beforedoubleClick(); } /**在元素上面悬停*/ public void mouseOver(){ Window.updateWindow(); ProxyRunnerListener.getDispatcher().beforemouserOver(); if(isExist()){ AutoBase.moveToElement(getElement()); logger.info(">>["+this.getId()+"]鼠标悬停成功!"); }else{ logger.error(">>没有找到元素,鼠标悬停失败!"); throw new MyAutoException("["+this.getId()+"]处鼠标进行悬停操作的时候失败了!很有可能的原因是没有找到元素!"); } ProxyRunnerListener.getDispatcher().beforemouserOver(); } /**在元素上面按下某一个键*/ public void keyDown(Keys key){ Window.updateWindow(); ProxyRunnerListener.getDispatcher().beforekeyDown(); if(isExist()){ AutoBase.keyDown(getElement(),key); logger.info(">>["+this.getId()+"]按下按钮"+key.toString()+"成功!"); }else{ logger.error("没有找到元素,按下按钮失败!"); throw new MyAutoException("["+this.getId()+"]进行按键操作的失败!很有可能的原因是没有找到元素!"); } ProxyRunnerListener.getDispatcher().afterkeyDown(); } /**在元素上面松开某一个键*/ public void keyUp(Keys key){ Window.updateWindow(); ProxyRunnerListener.getDispatcher().beforekeyUp(); if(isExist()){ AutoBase.keyUp(getElement(), key); logger.info(">>["+this.getId()+"]"+key+"松开成功!"); }else{ logger.error(">>按钮松开失败!没有找到元素!"); throw new MyAutoException("["+this.getId()+"]进行松开按钮操作的失败!很有可能的原因是没有找到这个元素!"); } ProxyRunnerListener.getDispatcher().beforekeyUp(); } /***在元素上按下左键*/ public void leftDown(){ Window.updateWindow(); ProxyRunnerListener.getDispatcher().beforeleftDown(); if(isExist()){ AutoBase.leftMouseDown(getElement()); logger.info(">>["+this.getId()+"]按下左键成功!"); }else{ logger.error(">>按下左键失败!没有找到元素!"); throw new MyAutoException("["+this.getId()+"]进行按下左键操作的时候失败了!很有可能的原因是没有找到此元素!"); } ProxyRunnerListener.getDispatcher().afterleftDown(); } /**在元素上松开左键*/ public void leftUp(){ Window.updateWindow(); ProxyRunnerListener.getDispatcher().beforeleftUp(); if(isExist()){ AutoBase.leftMouseUp(getElement()); logger.info(">>["+this.getId()+"]左键松开成功!"); }else{ logger.error(">>左键松开失败!"); throw new MyAutoException("进行松开左键操作的时候失败了!很有可能的原因是没有找到此元素!"); } ProxyRunnerListener.getDispatcher().afterleftUp(); } /**拖拽到指定的位置*/ public void dragAndDrop(Point location){ Window.updateWindow(); ProxyRunnerListener.getDispatcher().beforedragAndDrop(); if(isExist()){ AutoBase.dragAndDrop(getElement(), location.getX(), location.getY()); logger.info(">>["+this.getId()+"]拖拽成功!"); }else{ logger.error(">>拖拽失败!没有找到元素!"); throw new MyAutoException("["+this.getId()+"]进行拖拽操作的时候失败了!可能的原因是没有找到元素!"); } ProxyRunnerListener.getDispatcher().afterdragAndDrop(); } /**拖拽到指定的元素位置上*/ public void dragAndDrop(SElement element){ Window.updateWindow(); if(isExist()){ AutoBase.dragAndDrop(getElement(), element.getElement()); logger.info(">>["+this.getId()+"]拖拽到指定元素上成功!"); }else{ logger.error(">>拖拽到指定的元素上面失败!没有找到元素!"); throw new MyAutoException("["+this.getId()+"]进行拖拽操作的时候失败了!拖拽到指定元素失败!没有找到指定元素!"); } } /**得到元素的大小,得到高和宽的数组*/ public int[] getSize(){ if(isExist()){ Dimension ds=getElement().getSize(); int height=ds.getHeight(); int width=ds.getWidth(); int[] size =new int[]{height,width}; logger.info(">>["+this.getId()+"]得到尺寸成功!"); return size; }else{ logger.error(">>得到尺寸失败!没有找到元素!"); throw new MyAutoException("["+this.getId()+"]获取元素的尺寸失败了!没有找到元素!"); } //return null; } /**得到元素的位置*/ public Point getLocation(){ if(isExist()){ logger.info(">>["+this.getId()+"]得到元素位置成功!"); return getElement().getLocation(); }else{ logger.error(">>得到元素的位置失败!没有找到元素!"); throw new MyAutoException("["+this.getId()+"]得到元素位置失败!没有找到元素!"); } // return null; } /**得到属性值*/ public String getAttribute(String name){ if(isExist()){ logger.info("["+this.getId()+"]得到属性值为"+getElement().getAttribute(name)); return getElement().getAttribute(name); }else{ logger.error("获得属性值"+name+"失败!没有找到元素!"); throw new MyAutoException("["+this.getId()+"]没有获取到元素属性!元素没有被找到!"); } //return null; } /**得到标签的名字*/ public String getTagName(){ if(isExist()){ logger.info("["+this.getId()+"]得到标签值为"+getElement().getTagName()); return getElement().getTagName(); }else{ logger.error("得到标签的名字失败!没有找到元素!"); throw new MyAutoException("["+this.getId()+"]没有获得到tagname!元素没有找到!"); } //return null; } /**得到css的值*/ public String getCssValue(String name){ if(isExist()){ logger.info("["+this.getId()+"]得到css值为"+getElement().getCssValue(name)); return getElement().getCssValue(name); }else{ logger.error("得到css的值失败!没有找到元素!"); throw new MyAutoException("["+this.getId()+"]获取css值失败!元素没有找到!"); } //return null; } /**得到标签内的文本内容*/ public String getText(){ if(isExist()){ logger.info("["+this.getId()+"]得到文本内容为["+getElement().getText()+"]"); return getElement().getText(); }else{ logger.error("得到文本内的内容失败!元素不存在!"); throw new MyAutoException("["+this.getId()+"]得到文本内容失败!没有找到元素!"); // return null; } } /**元素是否可见的*/ public boolean isDisplay(){ if(isExist()){ return getElement().isDisplayed(); }else{ logger.info("判断元素是否可见失败!元素不存在!"); throw new MyAutoException("["+this.getId()+"]可见性判断失败!元素不存在!"); //return false; } } /**是否可以编辑的*/ public boolean isEnable(){ if(isExist()){ return getElement().isEnabled(); }else{ logger.error("元素不可以被编辑,元素不存在!"); throw new MyAutoException("["+this.getId()+"]判断可编辑性失败!元素不存在!"); //return false; } } /**是否被选择的*/ public boolean isSelected(){ if(isExist()){ return getElement().isSelected(); }else{ logger.error("元素可选择属性判断失败!元素不存在!"); throw new MyAutoException("["+this.getId()+"]元素可选择性判断失败!元素不存在!!"); //return false; } } /**视角移动到当前元素*/ public void scroll(){ Window.updateWindow(); ProxyRunnerListener.getDispatcher().beforescroll(); if(isExist()){ Window.scrollTo(getElement()); logger.info(">>["+this.getId()+"]视角滚动成功!"); }else{ logger.error("视角滚动失败!元素不存在!"); throw new MyAutoException("["+this.getId()+"]视角滚动失败!元素没有找到!!!"); } ProxyRunnerListener.getDispatcher().afterscroll(); } /**在此元素的基础上添加子元素 * @throws Exception */ public SElement childElement(Locator locator,String value) { switch(locator){ case Id: return new SElement(getElement().findElement(By.id(value))); case Xpath: return new SElement(getElement().findElement(By.xpath(value))); case Name: return new SElement(getElement().findElement(By.name(value))); case LinkText: return new SElement(getElement().findElement(By.linkText(value))); case PartialLinkText: return new SElement(getElement().findElement(By.partialLinkText(value))); case Css: return new SElement(getElement().findElement(By.cssSelector(value))); case Class: return new SElement(getElement().findElement(By.className(value))); case TagName: return new SElement(getElement().findElement(By.tagName(value))); default: throw new MyAutoException("定位方式错误,没有找到子元素"); } } /**在此元素的基础上添加子元素 * @throws Exception */ public SElement childElement(Locator locator,String value,int index) { SElement se; if(getElement()==null){ throw new NoSuchElementException("此元素还未进行指定locator,请先指定元素具体位置!"); } switch(locator){ case Id: se= new SElement(getElement().findElements(By.id(value)).get(index)); break; case Xpath: se= new SElement(getElement().findElements(By.xpath(value)).get(index)); break; case Name: se= new SElement(getElement().findElements(By.name(value)).get(index)); break; case LinkText: se= new SElement(getElement().findElements(By.linkText(value)).get(index)); break; case PartialLinkText: se= new SElement(getElement().findElements(By.partialLinkText(value)).get(index)); break; case Css: se= new SElement(getElement().findElements(By.cssSelector(value)).get(index)); break; case Class: se= new SElement(getElement().findElements(By.className(value)).get(index)); break; case TagName: se= new SElement(getElement().findElements(By.tagName(value)).get(index)); break; default: throw new MyAutoException("定位方式错误,没有找到子元素"); } if(se.getElement()==null){ throw new NoSuchElementException("["+this.getId()+"]在定位元素的时候发生了错误,很有可能是元素没有定位到!请检查自己配置的元素定位方式是否正确!"); } return se; } /**通过by的方式来获得子元素*/ public SElement childElement(By by,int index){ return new SElement(getElement().findElements(by).get(index)); } /**通过by的方式来活的子元素*/ public SElement childElement(By by){ return new SElement(getElement().findElement(by)); } public SElement childElement(SElement se){ return new SElement(se.getElement()); } /**输入*/ public void sendKeys(String text){ Window.updateWindow(); if(isExist()){ getElement().sendKeys(text); logger.info(">>["+this.getId()+"]输入值["+text+"]成功!"); }else{ logger.error(">>没有找到元素,输入失败!"); throw new MyAutoException("["+getId()+"]进行输入操作失败!很有可能的原因是在配置元素的时候发生错误。没有找到元素!"); } } /**表单内的确认*/ public void submit(){ Window.updateWindow(); if(isExist()){ getElement().submit(); logger.info(">>["+this.getId()+"]提交表单成功!"); }else{ logger.error(">>提交表单失败!元素没有找到!"); throw new MyAutoException("["+this.getId()+"]没有找到这个元素!,进行提交操作的时候出现错误!"); } } /**判断元素是否存在!*/ public boolean isExist(){ if(getElement()==null){ return false; }else{ return true; } } /**得到元素的id值*/ public String getId() { return id; } public void setId(String id) { this.id = id; } /**设置焦点在元素上面*/ public void focus(){ Window.updateWindow(); AutoBase.focus(getElement()); } }