selenium-java,解决一些加了显性等待和隐性等待都不好使的情况,以及给UI自动化加上暂停功能
最近在UI自动化时遇到了,上一步成功操作后没有响应的情况(动画加载和浏览器加载导致实际没有问题),导致下一步无法成功操作,所有想在尝试2次操作后再次进行上一步操作解决这种情况导致的错误(其实是不想每一次有问题都要手动加线程沉睡)
1.java应用程序,暂停/开始按钮
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import org.openqa.selenium.WebDriver;
import base_operation.Login; @SuppressWarnings({"static-access","deprecation"})
public class Common_method {public void paused_start(Element_operation element_operation){ JFrame frame = new JFrame("开始/暂停");//新建一个窗体,窗体的标题是""中的内容,
frame.setSize(200,100);//设置窗体的尺寸、Dimension frameSize=frame.getSize();
Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();//获取屏幕尺寸对象
//frame.setLocation((screenSize.width-frame.getWidth())/2, (screenSize.height-frame.getHeight())/2);//设置窗体坐标
frame.setLocation(screenSize.width-220, screenSize.height-150);
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE); //定义了点击关闭按钮的作用;
frame.setAlwaysOnTop(true);//把应用置于最前
frame.setVisible(true);//注意这一步一定要调用,使得这个窗体可见,false是不可见;
//JPanel panel = new JPanel();//Jpanel 是面板容器类,包含在swing中;
JButton jButton1 = new JButton("暂停");//定义一个button
frame.add(jButton1);
jButton1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(element_operation.get_paused_start()==0){
element_operation.paused();
System.out.println("暂停--------------------------------------------------");
jButton1.setText("开始");
}else if(element_operation.get_paused_start()==1){
element_operation.start();
System.out.println("开始--------------------------------------------------");
jButton1.setText("暂停");
}
}
});
} }
2.操作方法
import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import io.appium.java_client.android.AndroidDriver; public class Element_operation { private By[] Webelement = {By.className("初始化"),By.className("初始化")};
private String[] Webctype = {"click","click"};
private String[] Webcparameter = {"初始化","初始化"};
private By[] Androidelement = {By.className("初始化"),By.className("初始化")};
private String[] Androidctype = {"click","click"};
private String[] Androidcparameter = {"初始化","初始化"};
public int paused_start = 0;
public String return_text = "";
public static String click = "click";
public static String sendKeys = "sendKeys";
public static String getAttribute = "getAttribute";
public static String getText = "getText"; public int get_paused_start(){
//返回是否暂停,0开始,1暂停
return paused_start; } public void paused(){
//暂停
paused_start = 1; } public void start(){
//开始
paused_start = 0; } public String get_return_text(){
//返回值
return return_text; }
/*
* 记录并操作元素,优化过的等待并操作
* 1.上一步记录到数组0,这一步记录到数组1
* 2.尝试操作元素(这一步)
* 3.等待3秒后再尝试点击
* 4.进行上一步操作
* 5.循环2、3、4
* 6.循环3次后不再循环,抛错
*/
public void Web_Wait_Element(WebDriver WebDriver,By By,String type,String parameter){
Web_Change(By,type,parameter);
boolean open = true;
int i = 0;
int k = 3;//决定循环次数
while (open) {
try {
Web_Operate(WebDriver, By, Webctype, parameter, 1);
open = false;
} catch (Exception e) {
try {
Thread.sleep(5000);//等待5秒后再次操作
Web_Operate(WebDriver, By, Webctype, parameter, 1);
open = false;
} catch (Exception e2) {
i++;
if(i==k){
open = false;
System.out.println("这个玩意好顽固3次都搞不定--》"+By+"."+type+"(+"+parameter+")");
Web_Operate(WebDriver, By.id("错误"), Webctype, parameter, 0);
}
if(i==(k-1)){
System.out.println("进行了一次上一步操作---------------------------");
try {
Web_Operate(WebDriver, By, Webctype, parameter, 0);
} catch (Exception e3) {
// TODO: handle exception
System.out.println("上一步不存在--------------------------------");
}
}
}
}
}
} /*
* 对元素进行操作操作
* 参数
* driver、By.findElement(By.???)、操作类型如click、操作参数如sendKeys("???")、上一步0这一步1
*/
public void Web_Operate(WebDriver WebDriver,By By,String[] ctype,String parameter,int i){
while(paused_start==1){//判断是否暂停了
try {
Thread.sleep(1000);
} catch (Exception e) {
// TODO: handle exception
System.out.println("线程沉睡失败----------------------------------------------------------------");
}
}
System.out.println("\n定位-->"+Webelement[1]+"\n操作-->"+Webctype[1]+"\n参数-->"+Webcparameter[1]);
WebDriverWait wait = new WebDriverWait(WebDriver, 10);
wait.until(ExpectedConditions.visibilityOfElementLocated(By));//确定元素是否可见
while(paused_start==1){//判断是否暂停了
try {
Thread.sleep(1000);
} catch (Exception e) {
// TODO: handle exception
System.out.println("线程沉睡失败----------------------------------------------------------------");
}
}
switch (ctype[i]) {
case "click":
WebDriver.findElement(By).click();
break;
case "sendKeys":
WebDriver.findElement(By).sendKeys(parameter);
break;
case "getAttribute":
return_text = WebDriver.findElement(By).getAttribute(parameter);
break;
case "getText":
return_text = WebDriver.findElement(By).getText();
break;
default:
break;
}
} /*
* 记录操作,只记录2步,上一步0和这一步1
* 参数
* By.findElement(By.???)、操作类型如click、操作参数如sendKeys("???")
*/
public void Web_Change(By By,String type,String parameter){
By change;
change = Webelement[1];
Webelement[1] = By;
Webelement[0] = change; String change2;
change2 = Webctype[1];
Webctype[1] = type;
Webctype[0] = change2; String change3;
change3 = Webcparameter[1];
Webcparameter[1] = parameter;
Webcparameter[0] = change3;
}
}
使用示例:
public class Guest_Share_Test { private WebDriver WebDriver;
private Element_operation element_operation;
private Channel channel; private By input1 = By.id("kw");
private By button1 = By.id("su"); @Before
public void setUp() throws Exception {
element_operation = new Element_operation();
System.setProperty("webdriver.chrome.driver","D:\\Configuration\\chromedriver.exe");//这一步必不可少
WebDriver = new ChromeDriver();
Common_method common_method = new Common_method();
common_method.paused_start(element_operation);//开始/暂停应用
WebDriver.manage().window().maximize();
WebDriver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
} @After
public void tearDown() throws Exception {
try {
Thread.sleep(1000);
} catch (Exception e) {
// TODO: handle exception
}
WebDriver.quit();
} @Test
public void test() { WebDriver.get("http://www.baidu.com");
element_operation.Web_Wait_Element(WebDriver, input1, element_operation.sendKeys, "QQ");
element_operation.Web_Wait_Element(WebDriver, input1, element_operation.getText, "");
String text = element_operation.get_return_text();
System.out.println(text); element_operation.Web_Wait_Element(WebDriver, button1, element_operation.click, ""); }
}
selenium-java,解决一些加了显性等待和隐性等待都不好使的情况,以及给UI自动化加上暂停功能的更多相关文章
- selenium webdriver从安装到使用(python语言),显示等待和隐性等待用法,切换窗口或者frame,弹框处理,下拉菜单处理,模拟鼠标键盘操作等
selenium的用法 selenium2.0主要包含selenium IDE 和selenium webDriver,IDE有点类似QTP和LoadRunner的录制功能,就是firefox浏览器的 ...
- selenium+java解决富文本输入
方法一: Actions actions = new Actions(driver); actions.sendKeys(Keys.TAB).perform(); //鼠标通过tab要先移到富文本框中 ...
- 转 Python selenium 强制等待显示等待隐式等待
1. 1. 强制等待第一种也是最简单粗暴的一种办法就是强制等待sleep(xx),强制让闪电侠等xx时间,不管凹凸曼能不能跟上速度,还是已经提前到了,都必须等xx时间. 看代码: # -*- codi ...
- Python+Selenium自动化-设置等待三种等待方法
Python+Selenium自动化-设置等待三种等待方法 如果遇到使用ajax加载的网页,页面元素可能不是同时加载出来的,这个时候,就需要我们通过设置一个等待条件,等待页面元素加载完成,避免出现 ...
- ui自动化之selenium操作(四)简单元素操作
1. clear() clear()方法用于清除文本输入框内的内容:一般输入框中都有默认文字,如果不清空有可能会导致字符拼接: browser.find_element(By.ID,"use ...
- selenium Java中常见等待的几种形式
前言 在自动化测试中,我们经常会碰到编写脚本过程中操作某个元素的时候, 需要等待页面加载完成后,才能对元素操作,否则会报错,提示页面元素不存在异常,我们需要等待元素加载完成后,才能继续操作,而Sele ...
- Java+selenium+feeder+AutoIt+自动加载插件
package dataproject.datapro; import static org.testng.Assert.assertEqualsNoOrder; import java.io.Fil ...
- (java)selenium webdriver学习---三种等待时间方法:显式等待,隐式等待,强制等待
selenium webdriver学习---三种等待时间方法:显式等待,隐式等待,强制等待 本例包括窗口最大化,刷新,切换到指定窗口,后退,前进,获取当前窗口url等操作: import java. ...
- Selenium+Java(六)Selenium 强制等待、显式等待、隐实等待
前言 在实际测试过程中,由于网速或性能方面的原因,打开相应的网页后或在网页上做了相应的操作,网页上的元素可能不会马上加载出来,这个时候需要在定位元素前等待一下,等元素加载出来后再进行定位,根据实际使用 ...
随机推荐
- Unique Binary Search Trees,Unique Binary Search Trees2 生成二叉排序树
Unique Binary Search Trees:求生成二叉排序树的个数. Given n, how many structurally unique BST's (binary search t ...
- 正确使用iOS常量(const)、enum以及宏(#define)
前言:本文主要梳理iOS中如何使用常量.enum.宏,以及各自的使用场景. 重要的事情首先说:在iOS开发中请尽量多使用const.enum来代替宏定义(#define):随着项目工程的逐渐增大,过多 ...
- python+opencv链接摄像头
import cv2 import numpy as numpy cap=cv2.VideoCapture(0) #设置显示分辨率和FPS ,不设置的话会非常卡 cap.set(cv2.CAP_PRO ...
- (转)浅谈SQL Server 对于内存的管理
简介 理解SQL Server对于内存的管理是对于SQL Server问题处理和性能调优的基本,本篇文章讲述SQL Server对于内存管理的内存原理. 二级存储(secondary storage) ...
- linq 多条件join
var query=from a in db.A join b in db.B.Where(c=>c.num>3) on new {a.type ...
- Jsonnet-PHP v1.3.0 发布,支持 PHP 7 使用 Jsonnet
JsonNet-PHP 是 Google Jsonnet 对 PHP的支持扩展. pecl: http://pecl.php.net/package/jsonnet github: https://g ...
- 备注Quartz触发器设置
corn表达式时间格式: <!-- s m h d m w(?) y(?) -->, 分别对应: 秒>分>小时>日>月>周>年, ●星号(*):可用在所 ...
- Eclipse创建Maven聚合项目
整体架构图 1.新建父工程 新建maven父项目(用来管理jar包版本),使子系统使用同一个版本的jar包. File->New->Other->Maven Project,打包方式 ...
- Nginx安装和使用
Nginx简介 nginx不单可以作为强大的web服务器,也可以作为一个反向代理服务器,而且nginx还可以按照调度规则实现动态.静态页面的分离,可以按照轮询.ip哈希.URL哈希.权重等多种方式对后 ...
- 十九 Python分布式爬虫打造搜索引擎Scrapy精讲—css选择器
css选择器 1. 2. 3. ::attr()获取元素属性,css选择器 ::text获取标签文本 举例: extract_first('')获取过滤后的数据,返回字符串,有一个默认参数,也就是如 ...