更多新的信息:我现在对于为什么这个测试速度缓慢感到困惑。我已经消除了对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。
答案 0 :(得分:0)
抱歉,没有答案,而是建议(我将此作为评论发布,但是stackoverflow赢了,不让我):
通常情况下,当事情变得非常缓慢时,我会检查3件事情:
如果上述情况都不是,我也会对你怀疑的每个陈述进行计时,看看它们实际上是慢的还是它们都是同样慢的(例如那里有一个很长的突出的错误,有时是硒和#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分钟才能继续。