Selenium-WebDriver API Commands and Operations
2014-03-04 15:36
369 查看
Fetching a Page
The first thing you’re likely to want to do with WebDriver is navigate to a page.The normal way to do this is by calling “get”:driver.get("http://www.google.com");
Dependent on several factors, including the OS/Browser combination,WebDriver may or may not wait for the page to load. In some circumstances,WebDriver may return control before the page has finished, or even started, loading.To
ensure robustness, you need to wait for the element(s) to exist in the page usingExplicit and Implicit
Waits.
Locating UI Elements (WebElements)
Locating elements in WebDriver can be done on the WebDriver instance itself or on a WebElement.Each of the language bindings expose a “Find Element” and “Find Elements” method. The first returnsa WebElement object otherwise itthrows an exception. The latter returns a list of WebElements, it canreturn an empty list if no DOM elements match the query.
The “Find” methods take a locator or query object called “By”. “By” strategies are listed below.
By ID
This is the most efficient and preferred way to locate an element. Common pitfalls that UI developersmake is having non-unique id’s on a page or auto-generating the id, both should be avoided. A classon an html element is moreappropriate than an auto-generated id.
Example of how to find an element that looks like this:
<div id="coolestWidgetEvah">...</div>
WebElement element = driver.findElement(By.id("coolestWidgetEvah"));
By Class Name
“Class” in this case refers to the attribute on the DOM element. Often in practical use there aremany DOM elements with the same class name, thus finding multiple elements becomes the more practicaloption over finding the firstelement.
Example of how to find an element that looks like this:
<div class="cheese"><span>Cheddar</span></div><div class="cheese"><span>Gouda</span></div>
List<WebElement> cheeses = driver.findElements(By.className("cheese"));
By Tag Name
The DOM Tag Name of the element.Example of how to find an element that looks like this:
<iframe src="..."></iframe>
WebElement frame = driver.findElement(By.tagName("iframe"));
By Name
Find the input element with matching name attribute.Example of how to find an element that looks like this:
<input name="cheese" type="text"/>
WebElement cheese = driver.findElement(By.name("cheese"));
By Link Text
Find the link element with matching visible text.Example of how to find an element that looks like this:
<a href="http://www.google.com/search?q=cheese">cheese</a>>
WebElement cheese = driver.findElement(By.linkText("cheese"));
By Partial Link Text
Find the link element with partial matching visible text.Example of how to find an element that looks like this:
<a href="http://www.google.com/search?q=cheese">search for cheese</a>>
WebElement cheese = driver.findElement(By.partialLinkText("cheese"));
By CSS
Like the name implies it is a locator strategy by css. Native browser supportis used by default, so please refer tow3c css selectors <http://www.w3.org/TR/CSS/#selectors>for a list of generally available css selectors. If a browser does not havenative support for css queries, then
Sizzle is used. IE 6,7 and FF3.0currently use Sizzle as the css query engine.
Beware that not all browsers were created equal, some css that might work in one version may not workin another.
Example of to find the cheese below:
<div id="food"><span class="dairy">milk</span><span class="dairy aged">cheese</span></div>
WebElement cheese = driver.findElement(By.cssSelector("#food span.dairy.aged"));
By XPATH
At a high level, WebDriver uses a browser’s native XPath capabilities whereverpossible. On those browsers that don’t have native XPath support, we haveprovided our own implementation. This can lead to some unexpected behaviourunlessyou are aware of the differences in the various xpath engines.
Driver | Tag and Attribute Name | Attribute Values | Native XPath Support |
---|---|---|---|
HtmlUnit Driver | Lower-cased | As they appear in the HTML | Yes |
Internet Explorer Driver | Lower-cased | As they appear in the HTML | No |
Firefox Driver | Case insensitive | As they appear in the HTML | Yes |
<input type="text" name="example" /> <INPUT type="text" name="other" />
List<WebElement> inputs = driver.findElements(By.xpath("//input"));
The following number of matches will be found
XPath expression | HtmlUnit Driver | Firefox Driver | Internet Explorer Driver |
---|---|---|---|
//input | 1 (“example”) | 2 | 2 |
//INPUT | 0 | 2 | 0 |
when using xpath in WebDriver is that you should not expect to be ableto match against these implicit attributes.
Using JavaScript
You can execute arbitrary javascript to find an element and as long as you return a DOM Element,it will be automatically converted to a WebElement object.Simple example on a page that has jQuery loaded:
WebElement element = (WebElement) ((JavascriptExecutor)driver).executeScript("return $('.cheese')[0]");
Finding all the input elements to the every label on a page:
List<WebElement> labels = driver.findElements(By.tagName("label")); List<WebElement> inputs = (List<WebElement>) ((JavascriptExecutor)driver).executeScript( "var labels = arguments[0], inputs = []; for (var i=0; i < labels.length; i++){" + "inputs.push(document.getElementById(labels[i].getAttribute('for'))); } return inputs;", labels);
User Input - Filling In Forms
We’ve already seen how to enter text into a textarea or text field, but whatabout the other elements? You can “toggle” the state of checkboxes, and youcan use “click” to set something like an OPTION tag selected. DealingwithSELECT tags isn’t too bad:
WebElement select = driver.findElement(By.tagName("select")); List<WebElement> allOptions = select.findElements(By.tagName("option")); for (WebElement option : allOptions) { System.out.println(String.format("Value is: %s", option.getAttribute("value"))); option.click(); }
This will find the first “SELECT” element on the page, and cycle through eachof its OPTIONs in turn, printing out their values, and selecting each in turn.As you will notice, this isn’t the most efficient way of dealing with
SELECTelements. WebDriver’s support classes include one called “Select”, whichprovides useful methods for interacting with these.
Select select = new Select(driver.findElement(By.tagName("select"))); select.deselectAll(); select.selectByVisibleText("Edam");
This will deselect all OPTIONs from the first SELECT on the page, and thenselect the OPTION with the displayed text of “Edam”.
Once you’ve finished filling out the form, you probably want to submit it. Oneway to do this would be to find the “submit” button and click it:
driver.findElement(By.id("submit")).click();
Alternatively, WebDriver has the convenience method “submit” on every element.If you call this on an element within a form, WebDriver will walk up the DOMuntil it finds the enclosing form and then calls submit on that. If theelement
isn’t in a form, then the NoSuchElementException will be thrown:
element.submit();
Moving Between Windows and Frames
Some web applications have many frames or multiple windows. WebDriver supportsmoving between named windows using the “switchTo” method:driver.switchTo().window("windowName");
All calls to driver will now be interpreted as being directed to theparticular window. But how do you know the window’s name? Take a look at thejavascript or link that
opened it:
<a href="somewhere.html" target="windowName">Click here to open a new window</a>
Alternatively, you can pass a “window handle” to the “switchTo().window()”method. Knowing this, it’s possible to iterate over every open window like so:
for (String handle : driver.getWindowHandles()) { driver.switchTo().window(handle); }
You can also switch from frame to frame (or into iframes):
driver.switchTo().frame("frameName");
It’s possible to access subframes by separating the path with a dot, and youcan specify the frame by its index too. That is:
driver.switchTo().frame("frameName.0.child");
would go to the frame named “child” of the first subframe of the frame called“frameName”.
All frames are evaluated as if from *top*.
Popup Dialogs
Starting with Selenium 2.0 beta 1, there is built in support for handling popupdialog boxes. After you’ve triggered an action that opens apopup, you can access the alert with the following:Alert alert = driver.switchTo().alert();
This will return the currently open alert object. With this object you can now accept,dismiss, read its contents or even type into a prompt. This interface works equallywell on alerts, confirms, and prompts. Refer to the
JavaDocsor
RubyDocs for more information.
Navigation: History and Location
Earlier, we covered navigating to a page using the “get” command (driver.get("http://www.example.com")) As you’ve seen, WebDriver has anumber of smaller, task-focusedinterfaces, and navigation is a useful task.Because loading a page is such a fundamental requirement, the method to do thislives on the main WebDriver interface, but it’s simply a synonym to:
driver.navigate().to("http://www.example.com");
To reiterate: “navigate().to()” and “get()” do exactly the same thing.One’s just a lot easier to type than
the other!
The “navigate” interface also exposes the ability to move backwards and forwards in your browser’s history:
driver.navigate().forward(); driver.navigate().back();
Please be aware that this functionality depends entirely on the underlyingbrowser. It’s just possible that something unexpected may happen when you callthese methods if you’re used to the behaviour of one browser over another.
Cookies
Before we leave these next steps, you may be interested in understanding how touse cookies. First of all, you need to be on the domain that the cookie will bevalid for. If you are trying to preset cookies beforeyou start interactingwith a site and your homepage is large / takes a while to loadan alternative is to find a smaller page on the site, typically the 404 page is small(http://example.com/some404page)
// Go to the correct domain driver.get("http://www.example.com"); // Now set the cookie. This one's valid for the entire domain Cookie cookie = new Cookie("key", "value"); driver.manage().addCookie(cookie); // And now output all the available cookies for the current URL Set<Cookie> allCookies = driver.manage().getCookies(); for (Cookie loadedCookie : allCookies) { System.out.println(String.format("%s -> %s", loadedCookie.getName(), loadedCookie.getValue())); } // You can delete cookies in 3 ways // By name driver.manage().deleteCookieNamed("CookieName"); // By Cookie driver.manage().deleteCookie(loadedCookie); // Or all of them driver.manage().deleteAllCookies();
Changing the User Agent
This is easy with theFirefox Driver:
FirefoxProfile profile = new FirefoxProfile(); profile.addAdditionalPreference("general.useragent.override", "some UA string"); WebDriver driver = new FirefoxDriver(profile);
Drag And Drop
Here’s an example of using the Actions class to perform a drag and drop.Native events are required to be enabled.WebElement element = driver.findElement(By.name("source")); WebElement target = driver.findElement(By.name("target")); (new Actions(driver)).dragAndDrop(element, target).perform();
相关文章推荐
- WebDriver拾级而上·之十一 在selenium2.0中使用selenium1.0的API
- Python+Selenium WebDriver API:浏览器及元素的常用函数及变量整理总结
- Selenium WebDriver API
- selenium webdriver api
- 第4章 Selenium2-java WebDriver API (三)
- Selenium WebDriver history and today
- selenium(WebDriver) API
- Selenium的WebDriver API 提交 W3C 标准化
- <译>Selenium Python Bindings 6 - WebDriver API
- seleniumWebDriver的API操作_10_1
- seleniumWebDriver的API高级应用Log4j打印执行日志11_2
- selenium2(WebDriver) API
- selenium2.0(WebDriver) API - 转载自:http://www.cnblogs.com/puresoul/p/3477918.html
- Selenium WebDriver 中文教程 API(一)之基础讲解
- selenium2(WebDriver) API
- Selenium WebDriver入门——API 常用部分(适用于IE浏览器)
- Selenium - Webdriver API /ActionChains API
- selenium(webdirver)--在Firefox webdriver实例中添加Firebug and FirePath插件
- 20171017学习笔记Selenium 2 第四章WebDriver API 4.8定位一组元素4.9多表单切换4.10多窗口切换
- seleniumWebDriver的API操作杀进程、截屏、执行js脚本_10_4