package org.sky.auto.xml; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Stack; //import java.util.Stack; import org.apache.log4j.Logger; import org.dom4j.Element; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.sky.auto.base.AutoBase; import org.sky.auto.element.SElement; import org.sky.auto.exception.MyAutoException; import org.sky.auto.exception.MyElementNotFoundException; import org.sky.auto.window.Window; public class XMLToWebElement{ static Logger logger = Logger.getLogger(XMLToWebElement.class); //private AutoDriver driver; private String path; public String getPath() { return path; } public void setPath(String path) { this.path = path; } public SElement sElement(String id,String path){ SElement se= new SElement(element(id,path)); se.setId(id); return se; } public List<SElement> sElements(String id,String path){ List<SElement> slist =new ArrayList<SElement>(); for(WebElement we:elements(id,path)){ SElement se=new SElement(we); se.setId(id); slist.add(se); } return slist; } public WebElement element(String id){ XMLLoader.load("xml"); XMLElement xe = XMLLoader.getXMLElement(id); if(xe.isFrameElement()){ Window.selectDefaultWindow(); logger.info("元素"+id+"是Frame内的元素!"); enterFrame(xe, id); return getLocator(xe, id); }else{ Window.selectDefaultWindow(); return getLocator(xe, id); } } public List<WebElement> elements(String id){ return elements(id,"xml"); } public void enterFrame(XMLElement xe,String id){ Stack<Map<By,Integer>> stack = new Stack<Map<By,Integer>>(); int j=getParentFrameLevel(xe); XmlToJavaTools xjt = new XmlToJavaTools(); Element e=xe.getElement().getParent(); for(int i=0;i<j;i++){ Map<By,Integer> frameList = new HashMap<By,Integer>(); int index=0; String value = e.attributeValue("value"); String by = e.attributeValue("by"); if(e.getParent().attributeValue("index")!=null){ index = Integer.parseInt(e.getParent().attributeValue("index")); } //System.out.println(index); frameList.put(xjt.locator(by, value), index); e=e.getParent(); stack.push(frameList); } //System.out.println(stack.size()); while(!stack.empty()){ //WebElement we = null; By key=null; Integer value=null; Iterator<Entry<By,Integer>> iter = stack.pop().entrySet().iterator(); while(iter.hasNext()){ Entry<By,Integer> entry = iter.next(); key=entry.getKey(); //System.out.println(key); value=entry.getValue(); //System.out.println(value); } try{ Window.selectFrame(AutoBase.driver().findElements(key).get(value)); }catch(Exception e1){ throw new MyElementNotFoundException("切入进Frame的时候出现错误!请检查Frame的定位是否正确。错误的定位的方式-->"+key); } } } public WebElement element(String id,String path){ XMLDocument xd = new XMLDocument(path); XMLElements xes = new XMLElements(xd); //XMLNode xn = xe.getXMLNode(id); XMLElement xe = xes.getXMLElementOfAll(id); if(xe.isFrameElement()){ Window.selectDefaultWindow(); enterFrame(xe, id); return getLocator(xe, id); }else{ Window.selectDefaultWindow(); return getLocator(xe, id); } } public List<WebElement>elements(String id,String path){ XMLDocument xd = new XMLDocument(path); XMLElements xes = new XMLElements(xd); XMLList xl = xes.getXMLList(id); if(xl.getXMLElement()!=null){ Window.selectDefaultWindow(); return getListLocator(xl, id); }else if(xl.getFrameXMLElement()!=null){ Window.selectDefaultWindow(); enterListFrame(xl.getFrameXMLElement(), id); return getListLocator(xl, id); } return null; } protected WebElement getLocator(XMLElement xe,String id){ XmlToJavaTools xtj = new XmlToJavaTools(); WebElement we=null; if(xe==null){ try { throw new MyElementNotFoundException("查找元素["+id+"]的时候出现错误!没有找到正确的元素!"); } catch (Exception e) { e.printStackTrace(); } } if(xe.isListElement()){ throw new MyElementNotFoundException("查找元素["+id+"]的时候出现了错误,id为List元素,不能够返回单个元素值!"); } int index =0; if(xe.getIndex()!=null){ index = Integer.parseInt(xe.getIndex()); try{ index=Integer.parseInt(xe.getIndex()); }catch(NumberFormatException e1){ logger.error("元素["+id+"]的index值不能够被转化成为int类型,index的属性值输入错误!"); throw new MyAutoException("元素["+id+"]的index值不能够被转化成为int类型,index的属性值输入错误!"); } } try { we=AutoBase.driver().findElements(xtj.locator(xe.getBy(), xe.getValue())).get(index); } catch (Exception e) { logger.error("定位元素["+id+"]的时候,出现错误!"); throw new MyElementNotFoundException("定位元素["+id+"]的时候,出现错误!"); } List<XMLChildElement> xcelements=xe.getXMLChildElements(); if(xcelements.size()!=0){ for(XMLChildElement xc : xcelements){ int cindex=0; if(xc.getIndex()!=null){ try{ cindex=Integer.parseInt(xc.getIndex()); }catch(NumberFormatException e1){ logger.error("child元素["+xc.getValue()+"]的index值不能够被转化成为int类型,index的属性值输入错误!"); throw new MyAutoException("child元素["+xc.getValue()+"]的index值不能够被转化成为int类型,index的属性值输入错误!"); } } try{ we=we.findElements(xtj.locator(xc.getBy(), xc.getValue())).get(cindex); }catch(Exception e){ logger.error("定位元素["+id+"]的child元素的时候,出现错误!"); throw new MyElementNotFoundException("定位元素["+id+"]的child元素的时候,出现错误!"); } } } return we; } protected List<WebElement> getListLocator(XMLList xl,String id){ //Window.selectDefaultWindow(); XmlToJavaTools xtj = new XmlToJavaTools(); WebElement we=null; if(xl==null){ try { throw new MyElementNotFoundException("查找元素["+id+"]的时候出现错误!没有找到正确的元素!"); } catch (Exception e) { e.printStackTrace(); } } if(xl.getElement()!=null){ XMLElement xe = xl.getXMLElement(); int index =0; if(xe.getIndex()!=null){ index = Integer.parseInt(xe.getIndex()); try{ index=Integer.parseInt(xe.getIndex()); }catch(NumberFormatException e1){ logger.error("元素["+id+"]的index值不能够被转化成为int类型,index的属性值输入错误!"); throw new MyAutoException("元素["+id+"]的index值不能够被转化成为int类型,index的属性值输入错误!"); } } try { we=AutoBase.driver().findElements(xtj.locator(xe.getBy(), xe.getValue())).get(index); } catch (Exception e) { logger.error("定位元素["+id+"]的时候,出现错误!"); throw new MyElementNotFoundException("定位元素["+id+"]的时候,出现错误!"); } List<XMLChildElement> xcelements=xe.getXMLChildElements(); if(xcelements.size()!=0){ for(int i=0;i<xcelements.size();i++){ if(i==xcelements.size()-1){ XMLChildElement xce = xcelements.get(i); try { return we.findElements(xtj.locator(xce.getBy(), xce.getValue())); } catch (Exception e) { logger.error("定位元素["+id+"]的时候,出现错误!"); throw new MyElementNotFoundException("定位元素["+id+"]的时候,出现错误!"); } }else{ int cindex =0; XMLChildElement xce = xcelements.get(i); if(xce.getIndex()!=null){ try{ index=Integer.parseInt(xce.getIndex()); }catch(NumberFormatException e){ logger.error("元素["+id+"]的index值不能够被转化成为int类型,index的属性值输入错误!"); throw new MyAutoException("元素["+id+"]的index值不能够被转化成为int类型,index的属性值输入错误!"); } } try{ we=we.findElements(xtj.locator(xce.getBy(), xce.getValue())).get(cindex); }catch(Exception e){ logger.error("定位元素["+id+"]的时候,出现错误!"); throw new MyElementNotFoundException("定位元素["+id+"]的时候,出现错误!"); } } } } } return null; } public void enterListFrame(XMLElement xe,String id){ Stack<Map<By,Integer>> stack = new Stack<Map<By,Integer>>(); int j=getListParentFrameLevel(xe); XmlToJavaTools xjt = new XmlToJavaTools(); Element e=xe.getElement().getParent(); for(int i=0;i<j;i++){ Map<By,Integer> frameList = new HashMap<By,Integer>(); int index=0; String value = e.attributeValue("value"); String by = e.attributeValue("by"); if(e.getParent().attributeValue("index")!=null){ index = Integer.parseInt(e.getParent().attributeValue("index")); } //System.out.println(index); frameList.put(xjt.locator(by, value), index); e=e.getParent(); stack.push(frameList); } //System.out.println(stack.size()); while(!stack.empty()){ //WebElement we = null; By key=null; Integer value=null; Iterator<Entry<By,Integer>> iter = stack.pop().entrySet().iterator(); while(iter.hasNext()){ Entry<By,Integer> entry = iter.next(); key=entry.getKey(); //System.out.println(key); value=entry.getValue(); //System.out.println(value); } try{ Window.selectFrame(AutoBase.driver().findElements(key).get(value)); }catch(Exception e1){ throw new MyElementNotFoundException("切入进Frame的时候出现错误!请检查Frame的定位是否正确。错误的定位的方式-->"+key); } } } private int getParentFrameLevel(XMLElement xe){ int i=0; Element e = xe.getElement().getParent(); while(!e.isRootElement()){ i++; e=e.getParent(); } //System.out.println("元素含有的Frame数目为:->"+i); return i; } private int getListParentFrameLevel(XMLElement xe){ Element e = xe.getElement().getParent(); int i=0; while(!e.getName().toLowerCase().equals("list")){ i++; e=e.getParent(); } return i; } }