2016-11-29 70 views
2

我已将Sikuli与我的Selenium项目整合在一起。为了学习,我使用简单的gmail登录应用程序使用Sikuli自动化它。那么,我可以执行脚本。现在,让我们说,我在我的用户名字段中输入了一些内容。有时,鼠标不会徘徊到用户名字段。所以我的测试脚本失败了。这是间歇性的行为。Sikuli的间歇性故障

public static void main(String[] args) throws Exception { 

    Screen screen = new Screen(); 

    Pattern pattern1 = new Pattern("E:\\Projects\\Java\\Demo\\Images\\UserName.PNG"); 
    Pattern pattern2 = new Pattern("E:\\Projects\\Java\\Demo\\Images\\Password.PNG"); 
    Pattern pattern3 = new Pattern("E:\\Projects\\Java\\Demo\\Images\\SignIn.PNG"); 
    Pattern pattern4 = new Pattern("E:\\Projects\\Java\\Demo\\Images\\Next.PNG"); 
    Pattern pattern5 = new Pattern("E:\\Projects\\Java\\Demo\\Images\\SignedIn.PNG"); 
    Pattern pattern6 = new Pattern("E:\\Projects\\Java\\Demo\\Images\\SentMail.PNG"); 
    Pattern pattern7 = new Pattern("E:\\Projects\\Java\\Demo\\Images\\SentMessage.PNG"); 

    System.setProperty("webdriver.chrome.driver","E:\\Projects\\Java\\Demo\\Drivers\\chromedriver.exe"); 
    WebDriver driver = new ChromeDriver(); 
    driver.manage().timeouts().implicitlyWait(5,TimeUnit.SECONDS); 
    driver.navigate().to("https://www.gmail.com"); 
    driver.manage().window().maximize(); 
    screen.type(pattern1,"email id"); 
    screen.click(pattern4); 
    screen.type(pattern2,"password"); 
    screen.click(pattern5); 
    screen.click(pattern3); 
    screen.wait(pattern6,20); 
    screen.click(pattern6); 
    screen.wait(pattern7,5); 
    screen.click(pattern7); 
} 

有没有人有一个想法,为什么会发生这种情况?

+0

请张贴什么代码,你可以帮我们调试这种情况下,如果你创建一个http://jsfiddle.net你会得到同样的问题吗? – haxxxton

+0

@haxxxton - 我更新了我的代码 – Aishu

回答

0

首先,分享你的代码。

通常,像您描述的间歇性行为是由超时引起的。这意味着你正在寻找一个尚未存在或尚未稳定的元素。

您的方案中的一个实际示例可能会尝试在页面完全加载之前检测到用户名字段。了解你如何使用这两种工具将会很有用。你用于导航和什么元素标识?

说了这样的话,尝试解决这个问题最快的方法是在开始搜索用户名元素之前,延迟几秒钟。看看是否有帮助你。

编辑 现在,当您发布您的代码,看看这两条线:

driver.manage().window().maximize(); 
screen.type(pattern1,"email id"); 

在这里,你浏览器窗口最大化,并立即设法找到并键入所描述的元素pattern1。这可能是一个问题,因为您的driver实例不会等待窗口变为最大化并且下一个命令将立即开始执行。您应该留出一些时间来确保窗口已完成调整大小。只需在这些线条之间添加短暂的睡眠,看看是否有帮助。

+0

我已经更新了我的代码。正如我所说,我仍然看到那种间歇行为 – Aishu

+0

@Aishu看看我的编辑。 –

0

因为它是间歇性发生的并且发生在新绘制的屏幕中的第一个动作,所以这看起来像是一个计时问题。
这里的Sikuli解决方案是等到您的输入字段可用后再使用它。

的语句中使用的是:

wait(pattern1[, seconds]) 

插入之前:

screen.type(pattern1,"email id"); 

参考:
http://doc.sikuli.org/region.html#Region.wait