运行 Selenium WebDriver 2.37.1
我在运行测试时遇到间歇性问题并收到以下错误:
org.openqa.selenium.NoSuchElementException: no such element
有时测试会通过,大多数时候会失败。下面是堆栈跟踪:
org.openqa.selenium.NoSuchElementException: no such element
(Session info: chrome=31.0.1650.57)
(Driver info:
chromedriver=2.6.232923,platform=Windows NT 6.1 SP1 x86_64)
(WARNING:
The server did not provide any stacktrace information)
Command duration or timeout: 10.04 seconds
For documentation on this error, please visit:
http://seleniumhq.org/exceptions/no_such_element.html
Build info:
version: '2.34.0', revision:
'11cd0ef93615408e0b6b3bfa28defe125906461a', time: '2013-08-06
11:43:14'
System info: os.name: 'Windows 7', os.arch: 'amd64',
os.version: '6.1', java.version: '1.7.0_45'
Session ID:
2375dca8adea8bb6962b0c87861cdd59
Driver info:
org.openqa.selenium.chrome.ChromeDriver
Capabilities
下面是我执行测试的代码:
@Test
public void loginPage(){
chrome.get("http://thisisafakeurl.com");
//entering username
WebElement usernameField = chrome.findElement(By.cssSelector("input[type='text'][id='usernameInput']"));
usernameField.sendKeys("fakeusername");
//entering password
WebElement passwordField = chrome.findElement(By.cssSelector("input[id='passwordInput']"));
passwordField.sendKeys("fakepassword");
//clicking submit button
chrome.findElement(By.cssSelector("input#loginBtn.rightButton")).click();
chrome.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
//asserting a css selector. Not really needed. Just thrown in to learn.
// WebElement blankProjectLocator = chrome.findElement(By.cssSelector("li.iconGridItem[data-id='5']"));
// Assert.assertEquals("5", blankProjectLocator.getAttribute("data-id"));
//Clicking the Blank Project button
Actions actions = new Actions(chrome);
WebElement item1 = chrome.findElement(By.xpath("//*[@id=\"templateGrid\"]/li[2]/img[1]"));
WebElement item2 = chrome.findElement(By.xpath("//*[@id=\"templateGrid\"]/li[2]/img[2]"));
WebElement item3 = chrome.findElement(By.xpath("//*[@id=\"templateGrid\"]/li[2]/header/span"));
WebElement item4 = chrome.findElement(By.xpath("//*[@id=\"templateGrid\"]/li[2]"));
actions.moveToElement(item4)
.moveToElement(item1)
.moveToElement(item2)
.moveToElement(item3)
.click().build().perform();
chrome.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
//Dragging the Click Area component onto the canvas
WebElement listContainer = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div"));
WebElement componentList = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul"));
WebElement clickArea = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[1]"));
WebElement arrowHead = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[1]/div[1]"));
WebElement imageHolderClickArea = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[1]/div[1]/div"));
WebElement componentNameClickArea = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[1]/div[2]"));
WebElement canvas = chrome.findElement(By.xpath("//*[@id=\"page-c3\"]"));
actions.moveToElement(listContainer)
.moveToElement(componentList)
.clickAndHold(clickArea)
.moveToElement(arrowHead)
.moveToElement(imageHolderClickArea)
.moveToElement(componentNameClickArea)
.moveToElement(canvas)
.release().perform();
chrome.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
//Dragging the close button onto the canvas
WebElement listContainerClose = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div"));
WebElement componentListClose = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul"));
WebElement closeButton = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[2]"));
WebElement componentThumb = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[2]/div[1]"));
WebElement imageHolderCloseButton = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[2]/div[1]/div"));
WebElement componentNameCloseButton = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[2]/div[2]"));
WebElement canvas1 = chrome.findElement(By.xpath("//*[@id=\"page-c3\"]"));
actions.clickAndHold(closeButton)
.moveToElement(listContainerClose)
.moveToElement(componentListClose)
.moveToElement(componentThumb)
.moveToElement(imageHolderCloseButton)
.moveToElement(componentNameCloseButton)
.moveToElement(canvas1)
.release().perform();
//WebElement xAxisClose = chrome.findElement(By.xpath("//*[@id=\"c358\"]"));
//xAxisClose.clear();
//xAxisClose.sendKeys("240");
//WebElement yAxisClose = chrome.findElement(By.xpath("//*[@id=\"c359\"]"));
//yAxisClose.clear();
//yAxisClose.sendKeys("5");
//Dragging the video component onto the canvas
WebElement listContainerVideo = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div"));
WebElement componentListVideo = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul"));
WebElement videoComponent = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[3]"));
WebElement componentThumbVideo = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[3]/div[1]"));
WebElement componentNameVideo = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[3]/div[2]"));
WebElement canvas2 = chrome.findElement(By.xpath("//*[@id=\"page-c3\"]"));
actions.clickAndHold(videoComponent)
.moveToElement(listContainerVideo)
.moveToElement(componentListVideo)
.moveToElement(componentThumbVideo)
.moveToElement(componentNameVideo)
.moveToElement(canvas2)
.release().perform();
chrome.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
//Dragging the Text component onto the canvas
WebElement listContainerText = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div"));
WebElement componentListText = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul"));
WebElement textComponent = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[4]"));
WebElement componentThumbText = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[4]/div[1]"));
WebElement componentNameText = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div/ul/li[4]/div[2]"));
WebElement canvas3 = chrome.findElement(By.xpath("//*[@id=\"page-c3\"]"));
actions.clickAndHold(textComponent)
.moveToElement(listContainerText)
.moveToElement(componentListText)
.moveToElement(componentThumbText)
.moveToElement(componentNameText)
.moveToElement(canvas3)
.release().perform();
堆栈跟踪中的可点击链接将我指向以下代码行:
WebElement listContainer = chrome.findElement(By.xpath("//*[@id=\"componentsDiv\"]/div/div/div"));
所以在测试之前可以点击
Blank Project
按钮。
根据我的调查,我可能遇到一些同步问题,因为它是间歇性的。我是否需要包装 try/catch 异常而不是超时等待?或者我是否将它们放置在代码中不正确的位置?
任何人都可以帮助或建议我可能出错的地方吗?
正如 Yuvaraj HK 提到的,在代码中仅使用一次隐式等待就足够了。它会隐式等待您尝试在代码中find的每个元素。
chrome.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
但请尽量保持隐式等待时间尽可能短,因为这可能会增加代码执行时间..
在某些情况下,元素可能需要 30 秒以上才能可见,在这种情况下可以使用显式等待。
WebDriverWait some_element = new WebDriverWait(driver,100);
some_element.until(ExpectedConditions.visibilityOfElementLocated(By.id("id_of_some_element")));
//do anything you want with some_element
我强烈建议在 xpath 上使用 cssSelectors。 这篇文章可能会有所帮助。
即使使用 xpath,也尝试使用较短的路径。 使用 id 并不是访问元素的唯一方法。它的父级可能具有唯一的类名或其他属性,您可以使用它们来创建高效的
xpaths
或 cssSelectors
。
我猜你的测试有时会因为以下陈述而失败
chrome.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
只需在测试开始时放置一次超时代码并删除所有其他实例。
chrome.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
您打开了一个新窗口吗?如果是,则需要制作驱动程序来切换到新窗口,以下代码是我测试过的:
String currentWindow = driver.getWindowHandle();// get handle of current window
Set<String> handles = driver.getWindowHandles();// get handle of all windows
Iterator<String> it = handles.iterator();
while (it.hasNext()) {
if (currentWindow == it.next()) {
continue;
}
driver = driver.switchTo().window(it.next());// switch to new window
//business action
//xxxxxxx
}
driver.switchTo().window(currentWindow);//switch back to original window
对...所以我设法解决了这里发生的事情。当我使用 IntelliJ 时,似乎我需要告诉它调用每个方法的顺序。所以通过添加
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
并将“a”放在我的第一个方法上,然后将“b”放在我的第二个方法上(我将粘贴在问题中的代码分割成方法)等等,它按顺序运行方法,并等待每个方法方法:
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
我在 Windows Server 2003 上尝试测试 IE7 时遇到了同样的问题。我通过删除 Internet Explorer 增强的安全配置修复了该问题。在 Server 2003 上,您可以通过执行以下操作来修复它:
如果使用 Server 2008 或 2012,步骤会有所不同,但目标是相同的。
尝试使用 SeleniumWait 库:
SeleniumWait.withDriver(driver).withTimeOut(15).forElementToClick(element);
可能是浏览器问题。我遇到了这个问题,并尝试了各种措施来解决它,但直到浏览器的缩放百分比固定为 100% 才起作用。这可能听起来有点简单又有趣,但它对我有用。
这基本上是 Selenium 的多选项卡问题
打开一个新选项卡,然后切换回上一个选项卡以完成其他待处理的活动。为此,请使用 Action 类方法或使用 Selenium WebDriver 接口方法 getWindowHandle 和 getWindowHandles。在这种情况下,Selenium 可以通过 WindowHandlers 帮助处理多个选项卡。
现在让我们通过一个示例场景来了解它是如何工作的。这里的场景如下
IWebElement nameElement = await WaitElement<IWebElement>(() =>
{
return _driver.FindElement(By.CssSelector(".cc-header-info > .ant4-dropdown-trigger > span"));
}, 10000);
enter code here