Appium android 自动化测试,怎么等待页面元素加载完成之后再进行操作啊

抓蝴蝶 · 2015年04月07日 · 最后由 Monkey 回复于 2015年04月07日 · 2413 次阅读

在进行 android 自动化测试过程中,点击一个按钮,需要等到新界面加载完成再继续进行操作,但是这个时间有长有短,用 treadsleep() 的方式太不稳定了,怎么写代码让等待到页面元素出现再进行操作?
比如我点击新建消息按钮,怎么等到新界面中的发送按钮出现再进行操作?或者等到页面特有的某个 text 出现也行。
我看到网上有个方法:

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;

import org.openqa.selenium.JavascriptExecutor;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.WebElement;

import org.openqa.selenium.firefox.FirefoxDriver;

import org.openqa.selenium.support.ui.ExpectedCondition;

import org.openqa.selenium.support.ui.WebDriverWait;

public class WaitForSomthing {

/**
* @author gongjf
*/

public static void main(String[] args) {

// TODO Auto-generated method stub

System.setProperty("webdriver.firefox.bin","D:\Program Files\Mozilla Firefox\firefox.exe");

WebDriver dr = new FirefoxDriver();

//设置 10 秒

dr.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

String url = "file:///C:/Documents and Settings/gongjf/桌面/selenium_test/Wait.html";// "/Your/Path/to/Wait.html"

dr.get(url);

//注释掉原来的

/WebDriverWait wait = new WebDriverWait(dr,10);
wait.until(new ExpectedCondition(){
@Override
public WebElement apply(WebDriver d) {
return d.findElement(By.id("b"));
}}).click();
/

dr.findElement(By.id("b")).click();

WebElement element = dr.findElement(By.cssSelector(".red_box"));

((JavascriptExecutor) dr).executeScript("arguments[0].style.border = \"5px solid yellow\"",element);

}

}

这个封装的 class 只能用来等待特定某一个元素,我不同的界面要等待不同的元素出现,这个很不实用。
求大神们给支个招。

共收到 7 条回复 时间 点赞

代码请贴代码并使用代码块!
日志请贴日志并使用代码块!
提问,指明问题信息,请像一个职业测试一样报问题
支持 Markdown 格式, 粗体删除线单行代码
支持表情,见 Emoji cheat sheet
按 “M” 键查看更多 帮助。

代码请贴代码并使用代码块!
日志请贴日志并使用代码块!
提问,指明问题信息,请像一个职业测试一样报问题
支持 Markdown 格式, 粗体、删除线、单行代码
支持表情,见 Emoji cheat sheet
按 “M” 键查看更多 帮助。

#2 楼 @monkey 我贴的代码是别人写的一个等待元素的类,但是这个只能等待某一个特定元素。我想弄一个通用的类,能实现等待到 XXX 元素出现,XXX 元素不是固定元素,可以是 text,可以是元素 ID

#3 楼 @mzl19860128 建议使用 selenium 中 FluentWait 链式调用方式,可以解决此问题

可以看看这里
http://nowherewoman.com/selenium-handle-wait/
我不大清楚 appium 是否实现了 wait,你可以试一下。

#5 楼 @chenhengjie123 可以的,我用过了,完全 ok

#6 楼 @cpfeng0124
请问你用的是 webdriverwait 还是最后那个?webdriverwait 代码如下:
private static void WaitElement(By by, double seconds)
{
try
{
var wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(seconds))
{
Message = @by.ToString() + " is not exist"
};
wait.Until((d) => d.FindElement(@by));
}
catch(Exception e)
{
GetScreenShot(e);
}
}
这个代码转换成 java 该是怎么样的呢?timespan 这个完全没概念啊

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册