package org.sky.auto.text.read;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.log4j.Logger;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.sky.auto.base.AutoBase;
import org.sky.auto.exception.MyAutoException;
import org.sky.auto.exception.MyElementNotFoundException;
import org.sky.auto.window.Window;
import org.sky.auto.xml.XmlToJavaTools;
/**
* 这个类用来存储元素的层级关系,使用list,里面存了每个元素的层级关系。
* */
public class ChainLink{
private static Logger logger = Logger.getLogger(ChainLink.class);
private Map<By,Integer> bychain;
private String type;
private Map<By,Integer> framechain;
private boolean isframeElement=false;
public ChainLink(){
bychain=new LinkedHashMap<By,Integer>();
framechain=new LinkedHashMap<By,Integer>();
}
/**存储数据链,一个对象对应一个元素*/
public void save(String... locations){
XmlToJavaTools tool = new XmlToJavaTools();
for(String str:locations){
Integer index=0;
if(str.toLowerCase().contains(",")){
index=Integer.parseInt(str.split(",")[1].split(Block.VALUTION)[1]);
By by=tool.locator(str.split(",")[0].split(Block.VALUTION)[0],
TXTFormat.format(str.split(",")[0].split(Block.VALUTION)[1]));
bychain.put(by, index);
}else{
By by=tool.locator(str.split(Block.VALUTION)[0],TXTFormat.format(str.split(Block.VALUTION)[1]));
bychain.put(by, index);
}
}
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
/**判断元素是否在一个frame里面,链的一个属性*/
public boolean isFrameElement(){
return isframeElement;
}
/**设置frame是否存在的属性*/
public void setIsFrameElement(boolean bool){
this.isframeElement=bool;
}
public void saveFrame(String... locations){
XmlToJavaTools tool = new XmlToJavaTools();
for(String str:locations){
Integer index=0;
if(str.toLowerCase().contains(",")){
index=Integer.parseInt(str.split(",")[1].split(Block.VALUTION)[1]);
By by = tool.locator(str.split(",")[0].split(Block.VALUTION)[0],
TXTFormat.format(str.split(",")[0].split(Block.VALUTION)[1]));
framechain.put(by, index);
}else{
By by=tool.locator(str.split(Block.VALUTION)[0],TXTFormat.format(str.split(Block.VALUTION)[1]));
framechain.put(by, index);
}
}
}
/**可以将链的形式转化为WebElement的形式*/
public WebElement element(){
Window.selectDefaultWindow();
Map<By,Integer> map = getBychain();
Map<By,Integer> frameMap=getFramechain();
if(!getType().toLowerCase().contains("list")){
if(!isFrameElement()){
WebElement element=null;
int i=0;
Iterator<Entry<By,Integer>> mapEntry=map.entrySet().iterator();
while(mapEntry.hasNext()){
Entry<By,Integer> entry = mapEntry.next();
By by = entry.getKey();
Integer index = entry.getValue();
try{
if(map.size()==1){
element=AutoBase.driver().findElements(by).get(index);
}else{
if(i==0){
element=AutoBase.driver().findElements(by).get(index);
}else{
element=element.findElements(by).get(index);
}
}
}catch(Exception e){
logger.error("在查找元素的时候出现了错误,请检查元素定位是否错误!",e);
throw new MyElementNotFoundException("在查找元素的时候出现了错误,请检查元素定位是否错误!");
}
i++;
}
return element;
}else if(isFrameElement()){
int i=0;
int j=0;
WebElement element = null;
Iterator<Entry<By,Integer>> frameMapEntry =frameMap.entrySet().iterator();
while(frameMapEntry.hasNext()){
Entry<By,Integer> frameEntry=frameMapEntry.next();
By by=frameEntry.getKey();
Integer index = frameEntry.getValue();
try{
if(frameMap.size()==1){
Window.selectFrame(AutoBase.driver().findElements(by).get(index));
//System.out.println("切入进了Frame");
}else{
if(i==0){
element=AutoBase.driver().findElements(by).get(index);
}else{
element=element.findElements(by).get(index);
}
}
}catch(Exception e){
logger.error("切入到Frame的时候出现了错误,请确认Frame的定位是否正确",e);
throw new MyElementNotFoundException("切入到Frame的时候出现了错误,请确认Frame的定位是否正确");
}
i++;
}
Iterator<Entry<By,Integer>> mapEntry=map.entrySet().iterator();
while(mapEntry.hasNext()){
Entry<By,Integer> entry = mapEntry.next();
By by = entry.getKey();
Integer index = entry.getValue();
//System.out.println(by.toString());
try{
if(map.size()==1){
element=AutoBase.driver().findElements(by).get(index);
}else{
if(j==0){
element=AutoBase.driver().findElements(by).get(index);
}else{
element=element.findElements(by).get(index);
}
}
}catch(Exception e){
logger.error("没有找到Frame内的元素,请检查资源文档并确定定位是否正确!",e);
throw new MyElementNotFoundException("没有找到Frame内的元素,请检查资源文档并确定定位是否正确!");
}
j++;
}
return element;
}
}else{
logger.error("此元素的类型为List,不能够转化为WebElement的元素,请检查资源文件没有异常情况");
throw new MyAutoException("此元素的类型为List,不能够转化为WebElement的元素,请检查资源文件没有异常情况");
}
return null;
}
public Map<By, Integer> getBychain() {
return bychain;
}
public void setBychain(Map<By, Integer> bychain) {
this.bychain = bychain;
}
public Map<By, Integer> getFramechain() {
return framechain;
}
public void setFramechain(Map<By, Integer> framechain) {
this.framechain = framechain;
}
/**获取元素列表
* @return 返回一个list形式的元素列表
* */
public List<WebElement> elements(){
Window.selectDefaultWindow();
Map<By,Integer> map = getBychain();
Map<By,Integer> frameMap=getFramechain();
if(getType().toLowerCase().contains("list")){
if(!isFrameElement()){
Window.selectDefaultWindow();
WebElement element=null;
int i=0;
Iterator<Entry<By,Integer>> mapEntry=map.entrySet().iterator();
while(mapEntry.hasNext()){
Entry<By,Integer> entry = mapEntry.next();
By by = entry.getKey();
Integer index = entry.getValue();
if(map.size()==1){
return AutoBase.driver().findElements(by);
}else{
if(i==0){
element=AutoBase.driver().findElements(by).get(index);
}else if(i==map.size()-1){
return element.findElements(by);
}else{
element=AutoBase.driver().findElements(by).get(index);
}
}
i++;
}
}else if(isFrameElement()){
int i=0;
int j=0;
WebElement element = null;
Iterator<Entry<By,Integer>> frameMapEntry =frameMap.entrySet().iterator();
while(frameMapEntry.hasNext()){
Entry<By,Integer> frameEntry=frameMapEntry.next();
By by=frameEntry.getKey();
Integer index = frameEntry.getValue();
if(frameMap.size()==1){
Window.selectFrame(AutoBase.driver().findElements(by).get(index));
}else{
if(i==0){
element=AutoBase.driver().findElements(by).get(index);
}else{
element=element.findElements(by).get(index);
Window.selectFrame(element);
}
}
i++;
}
Iterator<Entry<By,Integer>> mapEntry=map.entrySet().iterator();
while(mapEntry.hasNext()){
Entry<By,Integer> entry = mapEntry.next();
By by = entry.getKey();
Integer index = entry.getValue();
if(map.size()==1){
return element.findElements(by);
}else{
if(j==map.size()-1){
return element.findElements(by);
}else{
element=element.findElements(by).get(index);
}
}
j++;
}
}
}else{
logger.error("没有找到匹配的type类型,如果是List的形式,请加入Type:List的说明");
throw new MyAutoException("没有找到匹配的type类型,如果是List的形式,请加入Type:List的说明");
}
return null;
}
}