我在Selenium RC遇到了一个奇怪的问题。当我使用IE7时,测试工作正常。但是,如果我使用firefox 3.5,Selenium会在完全加载之前获取页面。使用线程睡眠解决了这个问题。
IE和FireFox中处理页面加载标志的方式有何区别?
selenium.setTimeout(Timeout);
selenium.open("http://localhost");
selenium.waitForPageToLoad(Timeout);
selenium.windowMaximize();
selenium.windowFocus();
Thread.sleep(60000);
selenium.type("//html/body/table/tbody/tr[2]/td/div/form/table/tbody/tr[1]/td/table/tbody/tr[3]/td[2]/input","test");
selenium.type("pwd","test");
selenium.click("submit");
selenium.waitForPageToLoad(Timeout);
Thread.sleep(60000);
System.out.println(selenium.getLocation());
System.out.println(selenium.getHtmlSource());
String[] ro=selenium.getAllLinks();
System.out.println("-----"+ro.length);
在IE7中,一切都适用于thread.sleep,而不是FireFox。
答案 0 :(得分:3)
在发送Selenium命令之前,可能是在页面加载时运行的任何JavaScript都没有完成。例如,如果您尝试输入的输入最初被禁用,那么Selenium可能会在启用它的JavaScript完成之前尝试输入它。
如果是这种情况,您可以尝试在测试中添加适当的waitForCondition
命令,这将在条件满足后不断重新评估并继续,这比任意睡眠要好得多。
以下示例将等待元素启用:
selenium.waitForCondition("var value = selenium.isEditable('id=myElement'); value == true", "60000");
我还建议您查看定位器,因为它目前是一个非常脆弱的XPath,只是对您的Web应用程序的HTML源稍有改动可能会破坏您的测试。尝试查找id
属性并创建相对于该属性的xpath。
例如,如果您的决赛桌有id
myTable
,您可以使用:
xpath=id('myTable')//tr[3]/td[2]/input