使用iFrame打开新窗口后,测试用例运行速度非常慢

时间:2015-10-20 15:37:32

标签: java eclipse performance selenium iframe

更多新的信息:我现在对于为什么这个测试速度缓慢感到困惑。我已经消除了对javascript的需求,如下所述,我已添加报告以确定延迟的位置。这些是以" logger"开头的行。我添加了这些行后面的时间戳,以便您可以看到延迟的位置。这是代码的一部分,它看起来像混乱/需要很长时间(每次10分钟):

wait.until(ExpectedConditions.elementToBeClickable(By.id("ID")));
logger.log(LogStatus.INFO, "Waituntill is done and element is clickable"); /** logged as successfull at 17:45:51 */
driver.findElement(By.xpath("//div[@class='CLASS']")).click();
logger.log(LogStatus.INFO, "menu visible"); /** logged as successfull at 17:45:52 */
driver.findElement(By.xpath("//*[@class='CLASS' and text()='TEXT']")).click();
logger.log(LogStatus.INFO, "menu item is available and clickable."); /** logged as successfull at 17:55:47 */

奇怪的是,如果您按照测试过程,最后一步(点击)会立即显示,因为这会打开一个新窗口。这不是10分钟后。似乎在这一步之后内置了10个延迟。但是我的代码中没有这样的东西。上面的代码后跟:

Set <String> handles =driver.getWindowHandles();
Iterator<String> it = handles.iterator();
//iterate through your windows
while (it.hasNext()){
String parent = it.next();
String newwin = it.next();
driver.switchTo().window(newwin);

driver.switchTo().defaultContent();
logger.log(LogStatus.INFO, "timestamp1 defaultcontent"); /** logged as successfull at 17:55:47 */
WebElement frame=driver.findElement(By.xpath("/html/body/iframe"));
logger.log(LogStatus.INFO, "timestamp2 find xpath for iframe"); /** logged as successfull at 17:55:47 */
driver.switchTo().frame(frame); 
logger.log(LogStatus.INFO, "timestamp3 switch to iframe"); /** logged as successfull at 17:55:47 */
assertEquals("PageTitle", driver.getTitle());
logger.log(LogStatus.INFO, "timestamp4 confirm switch to iframe succesfull"); /** logged as successfull at 17:55:47 */

新信息:我已经研究过我的代码,看起来我对延迟发生的位置不正确。它现在看起来像我改变元素的样式,以便它显示,另一个元素变得可点击。我现在使用以下代码来更改样式,但这可能是问题所在。是否有更简单或更好的方法来改变元素的风格?

JavascriptExecutor js = (JavascriptExecutor) driver;
WebElement element = driver.findElement(By.xpath("//div[@class='button_ribbon_dropdownsection']"));
js.executeScript("arguments[0].setAttribute('style', 'left: 1520px; top: 40px; display: block;')",element);

原始帖子: 我有一个测试用例,我点击一个打开弹出窗口的链接。在此弹出窗口中是一个iFrame,其中包含我要声明和填充的字段。但是,运行此案例大约需要10分钟,我不知道为什么。这是我的代码:

//this is the link I click that opens the new window
driver.findElement(By.xpath("//*[@class='value' and text()='text']")).click();

//I have inserted this section to switch to the correct window (the popup). If I don't inlcude this the focus remains on the window where I clicked the link that opens the pop-up.
Set <String> handles =driver.getWindowHandles();
Iterator<String> it = handles.iterator();
//iterate through your windows
while (it.hasNext()){
String parent = it.next();
String newwin = it.next();
driver.switchTo().window(newwin);

//this is where I switch to the iFrame in the new window in order to reach the desired elements
WebElement testframe=driver.findElement(By.xpath("/html/body/iframe"));            
driver.switchTo().frame(testframe); /** this section may take up to 10-15 minutes */
assertEquals("pagetitle here", driver.getTitle());

assertEquals("value", driver.findElement(By.id("id")).getText());
driver.findElement(By.id("id")).clear();
driver.findElement(By.id("id")).sendKeys("number");

此代码确实运行,因此代码中没有错误(我可以找到),但它只需要很长时间而且我无法弄清楚原因。

我知道通过Xpath访问iFrame不是最好的方法,但它是商业产品,iframe没有id或名称,所以我无法通过那种方式导航到它。

我正在使用Eclipse与Selenium webdriver和Java。

3 个答案:

答案 0 :(得分:0)

抱歉,没有答案,而是建议(我将此作为评论发布,但是stackoverflow赢了,不让我):

通常情况下,当事情变得非常缓慢时,我会检查3件事情:

  • Selenium版本:他们定期有一些缓慢的错误,也许你很幸运有这个问题的版本;
  • Selenium版本与浏览器类型和版本。可能对您的浏览器版本的支持在您使用的selenium版本上不是最佳的。
  • 尝试使用缩减/禁用的javascript运行浏览器,如果可能的话。可能是因为某些javascript不能很好地使用selenium。

如果上述情况都不是,我也会对你怀疑的每个陈述进行计时,看看它们实际上是慢的还是它们都是同样慢的(例如那里有一个很长的突出的错误,有时是硒和#39; s sendKeys在IE上很慢)。并按照here的说明启用调试日志。希望能够为您提供有关正在进行的更多信息。

答案 1 :(得分:0)

首先想到的是你的第二个xpath:

//*[@class='CLASS' and text()='TEXT']

&#34; // *&#34;部分可能很慢。您可以尝试指定元素名称或路径,例如

//div[@class='CLASS' and text()='TEXT']

/select/sub/tree/to/search//*[@class='CLASS' and text()='TEXT']

限制搜索?

答案 2 :(得分:0)

感谢Kiril的建议。我发布这个作为答案,因为评论字段对于这个回复来说并不是很大。

我正在尝试实施你的建议,但我刚才尝试的两件事似乎都没有用。我使用完整的xpath找到了项目:

/html/body/form/div[4]/div[2]/span[6]/div[2]/div[2]/table/tbody/tr[3]/td[2]

正如我认为查看这个特定的表格对我试过的搜索来说是足够的限制:

driver.findElement(By.xpath("/html/body/form/div[4]/div[2]/span[6]/div[2]/div[2]/table/tbody//*[@class='value' and text()='text']")).click();

但是,这会导致NoSuchElementExcepttion

然后我尝试根据您的第一个建议更加具体并尝试:

driver.findElement(By.xpath("//td[@class='value' and text()='text']")).click();

这确实有效,但对测试的速度没有任何作用,它仍然需要10分钟才能继续。