标签:
本文总结了使用Selenium Web driver 做页面自动化测试的一些 tips, tricks, snippets.
两种方式
a) Packed (.crx file) -- crx为Chrome的插件后缀名,FireFox的是xpi
ChromeOptions options = new ChromeOptions(); options.addExtensions(new File("/path/to/extension.crx")); DesiredCapabilities capabilities = new DesiredCapabilities(); capabilities.setCapability(ChromeOptions.CAPABILITY, options); ChromeDriver driver = new ChromeDriver(capabilities);
b) Unpacked (directory)
ChromeOptions options = new ChromeOptions(); options.addArguments("load-extension=/path/to/extension"); DesiredCapabilities capabilities = new DesiredCapabilities(); capabilities.setCapability(ChromeOptions.CAPABILITY, options); ChromeDriver driver = new ChromeDriver(capabilities);
因为WebDriver每次启动一个Firefox的实例时,会生成一个匿名的profile, 如果想用自己的profile (包括extensions, 还有settings), 可以定义user data directory 路径
ChromeOptions options = new ChromeOptions(); options.addArguments("user-data-dir=C:/Users/user_name/AppData/Local/Google/Chrome/User Data");
网上有很多方式但好多试了都不行,下面这个是可行的
ChromeOptions options = new ChromeOptions(); options.addArguments("start-maximized"); DesiredCapabilities capabilities = DesiredCapabilities.chrome(); capabilities.setCapability(ChromeOptions.CAPABILITY, options);
由于很多网页嵌入Google Analytics, 这会导致Web Driver 访问的时候超慢, 下载这个no_google_analytics-0.6-an+fx.xpi文件, FireFox的插件, Chrome的网上也有,参考这里。
FirefoxProfile profile = new FirefoxProfile(); profile.addExtension(new File(getClass().getClassLoader().getResource("no_google_analytics-0.6-an+fx.xpi").getFile())); desiredCapabilities.setCapability(FirefoxDriver.PROFILE, profile);
a) 不使用代理
FirefoxProfile firefoxProfile = new FirefoxProfile(); firefoxProfile.setPreference("network.proxy.type", 0); driver = new FirefoxDriver(firefoxProfile);
b) 手动配置代理 http
FirefoxProfile firefoxProfile = new FirefoxProfile(); firefoxProfile.setPreference("network.proxy.type", 1); firefoxProfile.setPreference("network.proxy.http", "10.51.1.140"); firefoxProfile.setPreference("network.proxy.http_port", "8080"); driver = new FirefoxDriver(firefoxProfile);
c) 自动代理配置
FirefoxProfile firefoxProfile = new FirefoxProfile(); profile.setPreference("network.proxy.type", 2); profile.setPreference("network.proxy.autoconfig_url", "http://proxy.xxx.net:8001"); //Auto confi url driver = new FirefoxDriver(firefoxProfile);
##转载注明出处:http://www.cnblogs.com/wade-xu/p/4846155.html
firefoxProfile.setPreference("permissions.default.image", 2); firefoxProfile.setPreference("permissions.default.script", 2); firefoxProfile.setPreference("permissions.default.stylesheet", 2); firefoxProfile.setPreference("permissions.default.subdocument", 2);
String filePath = "path\\to\\file\for\\upload"; JavascriptExecutor jsx = (JavascriptExecutor) driver; jsx.executeScript("document.getElementById(‘fileName‘).value=‘" + filePath + "‘;");
WebElement frameElement = driver.findElement(By.id("id-of-frame"));
driver.switchTo().frame(frameElement);
String content = driver.getPageSource();
JavascriptExecutor jsx = (JavascriptExecutor) driver; String elementId = "element-id"; String html =(String) jsx.executeScript("return document.getElementById(‘" + elementId + "‘).innerHTML;");
##转载注明出处:http://www.cnblogs.com/wade-xu/p/4846155.html
JavascriptExecutor jsx = (JavascriptExecutor) driver; //Vertical scroll - down by 100 pixels jsx.executeScript("window.scrollBy(0,100)", ""); //Vertical scroll - up by 55 pixels (note the number is minus 55) jsx.executeScript("window.scrollBy(0,-55)", "");
也可以左右scroll
Actions actions = new Actions(driver); WebElement menuElement = driver.findElement(By.id("menu-element-id")); actions.moveToElement(menuElement).moveToElement(subMenuElement).click();
有些情况下,move到一级菜单 需要等待一会儿 才能定位到子菜单里的选项,可以thread sleep一会儿
actions.moveToElement(menuElement); Thread.sleep(1); actions.moveToElement(subMenuElement); Thread.sleep(1); actions.moveToElement(subSubMenuElement).click().perform();
背景色, 文字颜色, 文字字号
String bgcolor = driver.findElement(By.id("id123")).getCssValue("background-color"); String textColor = driver.findElement(By.id("id123")).getCssValue("color");
String textFont = dr.findElement(By.tagName("h3")).getCssValue("font")
鼠标需要一直按在上面才可定位到该元素,不然元素隐藏着,解决办法用Action, moveToElement然后Click 输入键盘动作Ctrl+A (全选)然后输入数据,最后perform(), 全选输入是为了清除原来的数据
action.moveToElement(textSpan).click().sendKeys(Keys.chord(Keys.CONTROL, "a")).sendKeys(input).perform();
有时候Button元素在页面底部,屏幕只能显示页面上班部分, click不到元素, 这种方式任何时候都可行。
((JavascriptExecutor)webDriver).executeScript("arguments[0].click();", webElement);
##转载注明出处:http://www.cnblogs.com/wade-xu/p/4846155.html
比如 html 如下
<div class="cities_boxer"> <div class="left_side"> <dl> <dt>A</dt> <dd> <a href="http://anshan.anjuke.com" class="">鞍山</a> <a href="http://anyang.anjuke.com" class="">安阳</a> <a href="http://anqing.anjuke.com" class="">安庆</a> </dd> </dl> </div> </div>
String link = null; List<WebElement> ls = driver.findElements(By.tagName("a")); List<String> links = new ArrayList<String>(); for (WebElement a : ls) { link = a.getAttribute("href"); links.add(link); }
比如浏览器F12 控制台输入
$$(‘.cities_boxer > div.left_side > dl:nth-child(1) > dd > a:nth-last-child(1)‘)
返回 <a href="http://anshun.anjuke.com" class="">安顺</a>
注: $$()
Returns an array of all the elements that match the specified CSS selector.
另一种方式
$x("//*[@id=‘content‘]/div[4]/div[1]/dl[1]/dd/a[last()]")
注:Returns an array of elements that match the specified XPath.
测试站点:http://www.anjuke.com/sy-city.html
wait = new FluentWait<WebDriver>(webDriver).withTimeout(10, TimeUnit.SECONDS) .pollingEvery(1, TimeUnit.SECONDS).ignoring(NoSuchElementException.class);
In FluentWait you have more options to configure apart from Maximum wait time like polling interval, exceptions to ignore etc.
File screenshot =((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
public void waitUntilBecomesVisible(WebElement webElement) { new WebDriverWait(webDriver, 10).until(ExpectedConditions.visibilityOf(webElement)); }
public void waitTextToBePresentInElement(WebElement element, String text) { new WebDriverWait(webDriver, 10).until(ExpectedConditions.textToBePresentInElement(element, text)); }
public void waitUntilInvisible(By by) { new WebDriverWait(webDriver, 10).until(ExpectedConditions.invisibilityOfElementLocated(by)); }
public void WaitUntilClickable(WebElement element) { new WebDriverWait(webDriver, 10).until(ExpectedConditions.elementToBeClickable(element)); }
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
public class PageBase { public PageBase(WebDriver driver) { AjaxElementLocatorFactory finder = new AjaxElementLocatorFactory(driver, 10); PageFactory.initElements(finder, this); } }
注: 常用于Web application 有很多Ajax组件元素
Selenium does comes with AjaxElementLocatorFactory, which creates instances of AjaxElementLocator. Now the idea is, if you send an Ajax request, this ElementLocator waits for 250 milliseconds to look for the element, till it ultimately times out (configurable). The only exposed API from Selenium, that I found, was PageFactory, whose main purpose is to create a DefaultElementLocatorFactory, which does not wait.
Alert alert = driver.switchTo().alert();
alert.accept();
alert.dismiss();
alert.getText();
WebElement element =driver.findElement(By.name("source")); WebElement target = driver.findElement(By.name("target")); (new Actions(driver)).dragAndDrop(element, target).perform();
if("input".equals(element.getTagName()){ element.sendKeys(""); } else{ new Actions(driver).moveToElement(element).perform(); }
或
((JavascriptExecutor)webDriver).executeScript("document.getElementById(‘elementid‘).focus();");
##转载注明出处:http://www.cnblogs.com/wade-xu/p/4846155.html
//Go back to the last visited page driver.navigate().back(); //go forward to the next page driver.navigate().forward();
driver.findElements(By.id("element-id")).size()!=0
WebElement element = driver.findElement(By.id("element-id")); if(element instanceof RenderedWebElement) { System.out.println("Element visible"); } else { System.out.println("Element Not visible"); }
感谢阅读,如果您觉得本文的内容对您的学习有所帮助,您可以点击右下方的推荐按钮,您的鼓励是我创作的动力。
##转载注明出处:http://www.cnblogs.com/wade-xu/p/4846155.html
25+ Useful Selenium Web driver Code Snippets For GUI Testing Automation
标签:
原文地址:http://www.cnblogs.com/wade-xu/p/4846155.html