zoukankan      html  css  js  c++  java
  • [翻译]Selenium API 命令和操作(JAVA)

    为了复习Selenium API, 把selenium的API doc翻译(参考了Google翻译)如下:

    获取页面

    一般而言, 你用WebDriver进行的第一件事是进入到某页面. 进入页面的方法是调用'get':

    driver.get("http://www.google.com");

    由于可能存在的多种因素(包括操作系统/浏览器的原因), WebDriver可能会或可能不会等待页面加载. 在某些情况下, WebDriver可能会在页面完成甚至加载之前返回执行下一步. 为了保证健壮性, 你需要使用"显式等待和隐式等待"来等待页面中元素的加载.

    定位UI元素(WebElements)

    WebDriver中的元素定位可以在WebDriver实例本身上或在WebElement上完成. Selenium支持的编程语言都有“Find Element”和“Find Elements”方法. 前者(Find Element)返回符合查询条件的WebElement对象, 如果找不到符合条件的元素, 则抛出异常,后者(Find Elements)返回符合条件的多个WebElement组成的列表, 如果找不到符合条件的元素, 则返回空列表.

     “Find”方法通过“By”去定位或查询对象. 下面列出了"By"的方式.

    By ID

    这是最有效及最推荐的定位元素的方式. 页面上的非唯一ID或自动生成的ID都应避免使用此方法. 此时, 通过类名方式查找元素比使用自动生成的id更合适.

    如何查找如下所示元素的示例:

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

    By Class Name (类名)

    此处的"Class"指DOM元素上的属性. 在实际使用中, 通常有许多具有相同类名的DOM元素. 因此, 与查找第一个元素相比, 使用元素组查找是更好的选择.

    如何查找如下所示元素的示例:

    <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 (标签名)

    元素的DOM标签名称. 

    如何查找如下所示元素的示例:

    <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

    顾名思义, 这是通过CSS的定位方式. 一般情况下浏览器均支持CSS, 请参阅w3c css选择器获取常用css选择器. 如果浏览器不支持CSS查询, 则请使用Sizzle.  IE 6, 7和FF3.0可使用Sizzle作为CSS查询引擎.

    请注意, 并非所有浏览器都是一样的, 某些可能在一个版本中使用的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

    在程序最外层(At a high level), WebDriver尽可能使用浏览器自身的XPath引擎. 在那些不支持XPath的浏览器上, 我们提供了自己的实现方式. 除非您知道各种XPath引擎之间的差异, 否则这可能会导致某些意外行为.

    Driver 标签和属性名 属性值 XPath支持
    HtmlUnit Driver 小写 和HTML上显示的一样 Yes
    Internet Explorer Driver 小写 和HTML上显示的一样 No
    Firefox Driver 大小写不敏感 和HTML上显示的一样 Yes

     

     

     

    这还有点抽象, 对于下面的HTML片段:

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

    被查找到的元素的个数:

    XPath表达式 HtmlUnit Driver Firefox Driver Internet Explorer Driver
    //input 1 (得到"example") 2 2
    //INPUT 0 2 0

     

    有时HTML元素不需要显式声明属性, 因为它们将默认为已知值. 例如, “input”标签不需要“type”属性, 因为它默认为“text”. 在WebDriver中使用xpath时不应期望能够与使用这些隐式属性匹配元素.

    使用JavaScript

    WebDriver支持使用JavaScript来查找元素, 只要其执行结果返回DOM元素, 该元素就会自动转换为WebElement对象.

    加载jQuery的页面的简单示例:

    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);

    获取文本值(Getting text values)

    人们通常希望获取元素内包含的文本值. 以下将返回字符串类型的值. 请注意, 这只会返回页面上可见文本.

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

    用户输入 - 填表(User Input - Filling In Forms)

    我们已经了解了如何在文本区域或文本字段中输入文本, 但是其他元素呢? 你可以“切换”复选框的状态, 也可以使用“单击”来设置类似选中的OPTION标签的内容. 使用SELECT标签是个不错的选择:

    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();
    }

    上述代码将返回页面上的第一个“ SELECT”元素, 获取所有OPTION并依次循环, 打印出它们的值并依次点击. 你可以看到, 这不是处理SELECT元素的最有效方法. WebDriver的支持类包括一个称为“Select”的类, 该类提供了与之交互的有用方法.

    Select select = new Select(driver.findElement(By.tagName("select")));
    select.deselectAll();
    select.selectByVisibleText("Edam");

    上述代码将从页面上的第一个SELECT中取消选择所有OPTION, 然后选择文本值为“ Edam”的OPTION.

    填写完表格后, 可能需要提交. 一种方法是找到“submit”按钮元素并单击它:

    driver.findElement(By.id("submit")).click();

    另外,WebDriver在每个元素上都提供了“submit”这个更方便的方法. 如果在表单标签范围内的元素上调用此方法, 则WebDriver将在DOM上移动, 直到找到表单的结束标签. 然后在该表单上调用Submit. 如果调用"submit"方法的元素不在表单标签中, 将抛出'NoSuchElementException':

    element.submit();

    在窗口和框架之间移动(Moving Between Windows and Frames)

    某些Web应用程序具有多个框架(Frames)或多个窗口(Windows).  WebDriver支持使用“switchTo”方法在已命名的窗口之间移动:

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

    现在,对driver的所有调用都将在此移动后的窗口上解释执行. 但是, 怎么获取窗口的名称呢? 看一下打开它的JavaScript或链接:

    <a href="somewhere.html" target="windowName">Click here to open a new window</a>

    或者, 你可以将“窗口句柄”("window handle")传递给“switchTo().window()”方法. 知道这点后就可以像下面那样遍历每个打开的窗口:

    for (String handle : driver.getWindowHandles()) {
        driver.switchTo().window(handle);
    }

    你还可以从一个框架(frame)切换到另一个框架(或切换到iframes)

    driver.switchTo().frame("frameName");

    弹出对话框(Popup Dialogs)

    从Selenium 2.0 beta 1开始, 内置了对弹出对话框的支持. 触发打开弹出窗口的操作后, 您可以通过以下方式访问Alert对话框:

    Alert alert = driver.switchTo().alert();

    上述代码将返回当前打开的Alert对象. 拿到Alert对象后, 你现在可以接受, 关闭, 阅读其内容, 甚至可以键入提示. 这些接口在alerts, confirms, 和prompts等对话框同样有效. 有关更多信息, 请参考JavaDocsRubyDocs.

    导航: 历史和直达(Navigation: History and Location)

    之前, 我们介绍了使用“ get”命令(driver.get("http://www.example.com"))导航到页面的方法. 如你所见, WebDriver具有许多较小的, 更专注任务的接口, 导航是一个好用的完成任务的接口. 由于加载页面是一项基本要求, 因此此方法直接存在于WebDriver接口上, 其使用简单如下:

    driver.navigate().to("http://www.example.com");

    重申:"navigate().to()" 和"get()" 做的事是完全一致的. 仅仅是一个比另一个少敲几个字.

    “navigate”接口还提供了浏览器历史记录中前进和后退的功能:

    driver.navigate().forward();
    driver.navigate().back();

    请注意, 此功能完全取决于在使用的浏览器. 如果你把一种浏览器的行为直接应用在另一种浏览器上的行为, 那么调用这些方法时, 很可能会出现与预期不符的情况.

    Cookies

    在我们进入下一步之前, 你可能有兴趣了解如何使用Cookie. 首先, 您需要位于该cookie对其有效的域上. 如果您在开始与网站进行交互之前尝试预设Cookie, 并且您的首页很大/需要一段时间才能加载, 则可以选择在网站上找到一个较小的页面(通常404页面很小, 例如 http://example.com/some404page).

    // 进入正确的域名
    driver.get("http://www.example.com");
    
    // 现在设置对整个域名范围有效的cookie
    Cookie cookie = new Cookie("key", "value");
    driver.manage().addCookie(cookie);
    
    // 现在输出所有当前URL可用的cookie
    Set<Cookie> allCookies = driver.manage().getCookies();
    for (Cookie loadedCookie : allCookies) {
        System.out.println(String.format("%s -> %s", loadedCookie.getName(), loadedCookie.getValue()));
    }
    
    // 你有三种方式去删除cookie
    // By name
    driver.manage().deleteCookieNamed("CookieName");
    // By Cookie
    driver.manage().deleteCookie(loadedCookie);
    // 或所有
    driver.manage().deleteAllCookies();

    更改用户代理(Changing the User Agent)

    使用Firefox Driver是很容易实现的:

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

    拖拽(Drag and Drop)

    以下是一个使用Actions类执行拖拽操作的示例. 本地事件需要打开(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();
  • 相关阅读:
    codeforces 447C. DZY Loves Sequences 解题报告(446A)
    ajax 请求多张图片数据
    window 常用软件
    linux 脚本命令匹配并获取下一行数据
    linux C之getchar()非阻塞方式
    php curl 库使用
    vue.js 简单入门
    巧用jQuery选择器写表单办法总结(提高效率)
    linux 中断理解
    linux 驱动 工作队列
  • 原文地址:https://www.cnblogs.com/fayez/p/11837550.html
Copyright © 2011-2022 走看看