webDriver文档阅读笔记

一些雷

  浏览器版本和对应的Driver的版本是一一对应的,有时候跑不起来,主要是因为driver和浏览器版本对不上。

  e.g: chrome和driver版本映射表:https://blog.csdn.net/huilan_same/article/details/51896672

    国内镜像下载:https://npm.taobao.org/mirrors/chromedriver/2.37/

官网api教程:

  https://www.seleniumhq.org/docs/03_webdriver.jsp

API文档:

  https://seleniumhq.github.io/selenium/docs/api/java/index.html

1.WebDriver and the Selenium-Server

You may, or may not, need the Selenium Server, depending on how you intend to use Selenium-WebDriver. If your browser and tests will all run on the same machine, and your tests only use the WebDriver API, then you do not need to run the Selenium-Server; WebDriver will run the browser directly.

There are some reasons though to use the Selenium-Server with Selenium-WebDriver.

  • You are using Selenium-Grid to distribute your tests over multiple machines or virtual machines (VMs).
  • You want to connect to a remote machine that has a particular browser version that is not on your current machine.
  • You are not using the Java bindings (i.e. Python, C#, or Ruby) and would like touse HtmlUnit Driver

超详细的document还提供了如何在eclipse和ideaJ中创建selenium的maven项目。。。。我的妈,被它的贴心重创了。

翻译一下:

一  如果浏览器和测试用例全在一台机器上面跑,可以只用WebDriverAPI。

  以下情况用selenium-server:

    1.用selenium-grid在多台机器和虚拟机上分布式运行用例;

    2.想连接远程机器;

    3.没有用java bindings,比如python,要用htmlUnit Driver 

常用api:

  

Fetching a Page:

driver.get("http://www.google.com");
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 using Explicit and Implicit Waits.

Locating UI Elements (WebElements):

  The “Find” methods take a locator or query object called “By”. “By” strategies are listed below.    

    By ID:

<div id="coolestWidgetEvah">...</div> 
WebElement element = driver.findElement(By.id("coolestWidgetEvah"));

   

    By Class Name:

<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:

 

<iframe src="..."></iframe>
WebElement frame = driver.findElement(By.tagName("iframe"))

    

    By Name:

<input name="cheese" type="text"/>
WebElement cheese = driver.findElement(By.name("cheese"));

    

    By Link Text:

 

<a href="http://www.google.com/search?q=cheese">cheese</a>>

  

WebElement cheese = driver.findElement(By.linkText("cheese"));

    

    By Partial Link Text:

<a href="http://www.google.com/search?q=cheese">search for cheese</a>>
WebElement cheese = driver.findElement(By.partialLinkText("cheese"));

  

    By CSS:

    

<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

<input type="text" name="example" />
<INPUT type="text" name="other" />
List<WebElement> inputs = driver.findElements(By.xpath("//input"));

  

At a high level, WebDriver uses a browser’s native XPath capabilities wherever possible. On those browsers that don’t have native XPath support, we have provided our own implementation. This can lead to some unexpected behaviour unless you 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

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

Sometimes HTML elements do not need attributes to be explicitly declared because they will default to known values. For example, the “input” tag does not require the “type” attribute because it defaults to “text”. The rule of thumb when using xpath in WebDriver is that you should not expect to be able to match against these implicit attributes.

  需要xpath知识

    Using JavaScript:

WebElement element = (WebElement) ((JavascriptExecutor)driver).executeScript("return $('.cheese')[0]");
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);

  

  需要javascript知识

    Getting text values:

People often wish to retrieve the innerText value contained within an element. This returns a single string value. Note that this will only return the visible text displayed on the page.

WebElement element = driver.findElement(By.id("elementID"));
element.getText();

    

    User Input - Filling In Forms:

We’ve already seen how to enter text into a textarea or text field, but what about the other elements? You can “toggle” the state of checkboxes, and you can use “click” to set something like an OPTION tag selected. Dealing with SELECT 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 each of 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 SELECT elements. WebDriver’s support classes include one called “Select”, which provides 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 then select the OPTION with the displayed text of “Edam”.

Once you’ve finished filling out the form, you probably want to submit it. One way 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 DOM until it finds the enclosing form and then calls submit on that. If the element isn’t in a form, then the NoSuchElementException will be thrown:   

    Moving Between Windows and Frames:

Some web applications have many frames or multiple windows. WebDriver supports moving between named windows using the “switchTo” method:

driver.switchTo().window("windowName");

  All calls to driver will now be interpreted as being directed to the particular window. But how do you know the window’s name? Take a look at the javascript 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");

      

   

    Popup Dialogs:

After you’ve triggered an action that opens a popup, 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 equally well on alerts, confirms, and prompts.

    

  Navigation: History and Location

  Earlier, we covered navigating to a page using the “get” command (driver.get("http://www.example.com") or driver.Url="http://www.example.com" in C#). As you’ve seen, WebDriver has a number of smaller, task-focused interfaces, and navigation is a useful task. Because loading a page is such a fundamental requirement, the method to do this lives 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 underlying browser. It’s just possible that something unexpected may happen when you call these 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 to use cookies. First of all, you need to be on the domain that the cookie will be valid for. If you are trying to preset cookies before you start interacting with a site and your homepage is large / takes a while to load an alternative is to find a smaller page on the site (typically the 404 page is small, e.g. 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

FirefoxProfile profile = new FirefoxProfile();
profile.addAdditionalPreference("general.useragent.override", "some UA string");
WebDriver driver = new FirefoxDriver(profile);

  

Drag And Drop

WebElement element = driver.findElement(By.name("source"));
WebElement target = driver.findElement(By.name("target"));

(new Actions(driver)).dragAndDrop(element, target).perform();

  

https://seleniumhq.github.io/selenium/docs/api/java/index.html

HtmlUnit Driver

This is currently the fastest and most lightweight implementation of WebDriver. As the name suggests, this is based on HtmlUnit. HtmlUnit is a java based implementation of a WebBrowser without a GUI. For any language binding (other than java) the Selenium Server is required to use this driver.

WebDriver driver = new HtmlUnitDriver();

  试了一下,没有gui界面,但是可以正常测试,不过会有css警告。

其他的Driver不做概述,FirefoxDriver(),ChromeDriver(),InternetExplorerDriver()等等有界面,都是打开对应的browser。

iosDriver 和android的Driver

参考网址:  

      http://ios-driver.github.io/ios-driver/

      http://selendroid.io/

上一篇:idea执行mapreduce报错 Could not locate Hadoop executable: C:\hadoop-3.1.1\bin\winutils.exe


下一篇:Eclipse 修改自动补全触发器只能输入四个字符为多个字符