zoukankan      html  css  js  c++  java
  • java-selenium(一)元素定位

    在定位单个元素时,selenium-webdriver 提示了如下一些方法对元素进行定位。下面这些定位方式中,优先使用 id、name、classname,对于网上的链接元素,推荐使用linkText 定位方式,对于不好定位的元素,考虑使用火狐的插件去辅助定位(xpath)。

    1. 当页面元素有id属性的时候尽量使用id来定位。没有的话,再选择其他定位方法

    2. cssSelector执行速度快,推荐使用 

    3. 定位超链接的时候,可以考虑linkText或partialLinkText:但是要注意的是,文本经常发生改变,所以不推荐用

    4. xpath功能最强悍。当时执行速度慢,因为需要查找整个DOM,所以尽量少用。实在没有办法的时候,才使用xpath 

    通过ID查找元素: By.id()

    以百度主页为例,  搜索框的HTML示例代码如下,   它的ID为kw

    <input type="text" autocomplete="off" maxlength="100" id="kw" name="wd" class="s_ipt">

    "百度一下"搜索按钮元素的HTML示例代码如下,   它ID为su

    <input type="submit" class="btn self-btn bg s_btn" id="su" value="百度一下">

    在Selenium/WebDriver 中通过ID查找元素的Java示例代码如下

            WebDriver driver  = new FirefoxDriver();
            driver.get("http://www.baidu.com");
             
            WebElement searchBox = driver.findElement(By.id("kw"));
            searchBox.sendKeys("selenium");
            WebElement searchButton = driver.findElement(By.id("su"));
            searchButton.submit();
            
            driver.close();

    通过Name查找元素:By.name()

    以百度主页为例,  搜索框的HTML示例代码如下,   它的name为wd

    <input type="text" autocomplete="off" maxlength="100" id="kw" name="wd" class="s_ipt">

    在Selenium/WebDriver 中通过name查找元素的Java示例代码如下

            WebDriver driver  = new FirefoxDriver();
            driver.get("http://www.baidu.com");       
            WebElement searchBox = driver.findElement(By.name("wd"));
    

    通过ClassName 查找元素 By.className

    以淘宝网的主页搜索为例, 其搜索框的HTML代码如下:   class="search-combobox-input"

    <input autocomplete="off" autofocus="true" accesskey="s" aria-label="请输入搜索文字" name="q" id="q" class="search-combobox-input" aria-haspopup="true" aria-combobox="list" role="combobox" x-webkit-grammar="builtin:translate" tabindex="0">

    Java 示例代码如下

            WebDriver driver  = new FirefoxDriver();
            driver.get("http://www.taobao.com");
            Thread.sleep(15000);
            WebElement searchBox = driver.findElement(By.className("search-combobox-input"));
    
            searchBox.sendKeys("羽绒服");
            searchBox.submit();

    小技巧:处理复合ClassName方法

    <input type="submit" id="su" value="百度一下" class="bg s_btn">

     上述元素的 class 为 bg s_btn,中间有空格的即为复合型 class,此时直接按By.className("bg s_btn")则会报错 Compound class names are not supported.Consider searching for one class name and filtering the results or use CSSselectors .

    处理方法为只选择 class 属性中的一个值,下面的代码就不会报错了

    driver.findElement(By.className("s_btn"));

    通过TagName查找元素: By.tagName()

    通过tagName来搜索元素的时候,会返回多个元素. 因此需要使用findElements()

            WebDriver driver  = new FirefoxDriver();
            driver.get("http://www.cnblogs.com");
             
            List<WebElement> buttons = driver.findElements(By.tagName("div"));
            System.out.println("Button:" + buttons.size());

    注意:  如果使用tagName,  要注意很多HTML元素的tagName是相同的,

    比如单选框,复选框, 文本框,密码框.这些元素标签都是input.  此时单靠tagName无法精确获取我们想要的元素, 还需要结合type属性,才能过滤出我们要的元素

            WebDriver driver  = new FirefoxDriver();
            driver.get("http://www.cnblogs.com");
             
            List<WebElement> buttons = driver.findElements(By.tagName("input"));
            for (WebElement webElement : buttons) {
                if (webElement.getAttribute("type").equals("text")) {
                    System.out.println("input text is :" + webElement.getText());
                }
            }

    通过LinkText查找元素 By.linkText();

     直接通过超链接上的文字信息来定位元素:例如

    <a href="https://passport.baidu.com/v2/?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2F" name="tj_login" class="lb" onclick="return false;">登录</a>

    HTML 代码如下

            WebDriver driver  = new FirefoxDriver();
            driver.get("http://www.baidu.com");
            WebElement loginLink = driver.findElement(By.linkText("登录"));
            loginLink.click();

    通过PartialLinkText 查找元素 By.partialLinkText()

    此方法是上一个方法的加强版,单你只想用一些关键字匹配的时候,可以使用这个方法,通过部分超链接文字来定位元素

    HTML 代码如下

            WebDriver driver  = new FirefoxDriver();
            driver.get("http://www.baidu.com");
            WebElement loginLink = driver.findElement(By.partialLinkText("登"));
            loginLink.click();

    注意:用这种方法定位时,可能会引起的问题是,当你的页面中不知一个超链接包含“等”时,findElement方法只会返回第一个查找到的元素,而不会返回所有符合条件的元素

    如果你想要获得所有符合条件的元素,还是只能用findElements方法

  • 相关阅读:
    一片非常有趣的文章 三分钟读懂TT猫分布式、微服务和集群之路
    mysql+mycat搭建稳定高可用集群,负载均衡,主备复制,读写分离
    mycat读写分离+垂直切分+水平切分+er分片+全局表 测试
    LVS Nginx HAProxy 优缺点
    nginx map配置根据请求头不同分配流量到不同后端服务
    Javamail发送邮件
    java发送html模板的高逼格邮件
    学习openresty时,nginx的一个坑
    mysql数据导出golang实现
    mysql支持原生json使用说明
  • 原文地址:https://www.cnblogs.com/fulucky/p/7337587.html
Copyright © 2011-2022 走看看