WebDriver API 定位元素

 

目录

前言

前提准备

WebDriver对浏览器的操作

获取页面信息

自定义profile

元素定位


前言

Selenium是开源的自动化测试框架,通过Selenium可以记录你在浏览器执行的操作,录制并可以导出为Java代码。导出的代码可以执行,以到达复现你对浏览器的操作。代码中最关键的就是WebDriver,它可以通过各种浏览器的驱动来驱动浏览器。

前提准备

geckodriver.exe / chromedriver.exe / IEDriverServer.exe

Firefox / chrome / IE 

selenium-server-standalone-3.141.59.jar

这三个分别是浏览器驱动程序、浏览器、jar包。他们之间不同不版本可能会引起不兼容问题,但是厂商没有给出具体的标准,暂时最三者新版同时工作不会有问题。

WebDriver对浏览器的操作

(1)打开浏览器

// 火狐浏览器
System.setProperty("webdriver.gecko.driver", "D:\\demo\\geckodriver.exe");
System.setProperty("webdriver.firefox.bin","D:\\ProgramFiles\\MozillaFirefox\\firefox.exe");
WebDriver driver = new FirefoxDriver();

// 谷歌浏览器
System.setProperty("webdriver.chrome.driver", "D:\\demo\\chromedriver.exe");
WebDriver driver = new ChromeDriver();

// IE浏览器
System.setProperty("webdriver.ie.driver", "D:\\demo\\IEDriverServer.exe");  
WebDriver driver = new InternetExplorerDriver();

 第一个参数对于使用的浏览器来说是固定的,需要记住。第二个参数就是浏览器驱动程序的路径。对于火狐浏览器,当下载的路径没有默认在c盘时,需要加上路径指明语句,第一个参数固定,第二个参数是浏览器路径。

(2)关闭浏览器

driver.close();//只是关闭当前页面,不会geckodriver的进程

driver.quit();//彻底关闭浏览器,geckodriver的进程关闭,释放资源

 这两个方法的区别务必记住。一般在程序最后都会加上quit语句,如果不加那么每执行一次代码就启动一次驱动程序,多次启动会相当占用内存资源,导致出现未知错误。

(3)访问网页

String baseUrl="https://www.baidu.com/";

driver.get(baseUrl);

driver.navigate().to(baseUrl); // 两种方式都可以

(4)返回 / 前进 / 刷新

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

(5)浏览器尺寸的控制

// 设置浏览器大小
Dimension size = new Dimension(300, 400);
driver.manage().window().setSize(size);

// 浏览器最大化
driver.manage().window().maximize();

获取页面信息

// 获取title标签中的内容
String title = driver.getTitle();

// 获取当前url
String current = driver.getCurrentUrl();

// 获取网页的代码信息
String htmlsrc = driver,getPageSource();

 可以syso一下看看具体内容。

自定义profile

我们平时WebDriver driver = new FirefoxDriver();这样做,启动的是一个和原始状态一样的浏览器。但是在测试时会需要一些已有的用户信息,cookie信息等,这就需要自行配置profile。

打开cmd,输入D:\\firefox\\firefox.exe -p -no -remote,这里-p -no -remote之前是浏览器的路径,因人而异。回车后弹出配置页面。

默认的文件是default,你可以创建配置文件,自定义名称然后启动Firefox, 这样启动的浏览器就是全新的,配置过程中还会让你选择新建的配置文件路径,这样你打开的浏览器就是全新的。想切换回原有的浏览器,可以再次打开配置,双击default。

在测试的时候也可以通过代码控制打开自己配置的浏览器。

ProfilesIni allprofiles = new ProfilesIni();
FirefoxProfile pro = allprofiles.getProfile("test01");
FirefoxOptions options = new FirefoxOptions();
options.setProfile(pro);

System.setProperty("webdriver.gecko.driver", "D:\\demo\\geckodriver.exe");
System.setProperty("webdriver.firefox.bin","D:\\ProgramFiles\\MozillaFirefox\\firefox.exe");

WebDriver driver = new FirefoxDriver(options);

元素定位

测试时我们需要操控网页的某些控件例如超链接、文本框、按钮等,需要我们找到要操控的元素。定位的本质还是查找html代码。

(1)ID

driver.findElement(By.id("id值"))

 例如:

<input id="kw" class="s_ipt" name="wd" maxlength="100" autocomplete="off" type="text">
WebElement element = driver.findElement(By.id("kw"));
WebElement submitButton= driver.findElement(By.id("submit"));
submitButton.click();

(2)name

例如:

<input id="kw" class="s_ipt" name="wd" maxlength="100" autocomplete="off" type="text">
WebElement element = driver.findElement(By.name("wd"));

(3)className

 例如:

<input id="kw" class="s_ipt" name="wd" maxlength="100" autocomplete="off" type="text">
WebElement element = driver.findElement(By.className("s_ipt "));

(4)tagName

例如:

<input id="kw" class="s_ipt" name="wd" maxlength="100" autocomplete="off" type="text">
WebElement element = driver.findElements(By.tagName("input"));

一个页面的tagName有多个,建议使用findElements()

WebElement searchInput= driver.findElements(By.tagName("a"));
List<WebElement> scriptList= driver.findElements(By.tagName("a"));

scriptList是一个集合,其中存放着所有的a标签,按顺序存储。

(5)linkTest

专门用来查找超链接

例如:

<a class="mnav" href="http://news.baidu.com" target="_blank">新闻</a>
WebElement newsLink= driver.findElement(By.linkText("新闻"));
newsLink.click();

(6)partialLinkTest

partialLinkTest是linkTest的补充,有些文本链接比较长,这时可以去文本链接中的一部分进行定位,只要这一部分可以唯一的标识这个链接。

例如:

<a class="mnav" href="http://www.hao123.com" target="_blank">hao123</a>
WebElement pLink= driver.findElement(By.partialLinkText("123"));

(7)xpath

绝对路径定位(不建议使用):

WebElement button= driver.findElement(By.xpath("/html/body/div[1]/input"));

 xpath中的内容可以在浏览器控制台中找到要控制的元素节点,右键找到xpath,然后赋值。内容的意思就是html标签中body标签中第一个div中的input。不推荐使用的原因是网页代码出现改动,那么测试代码也要修改,不方便。

相对路径定位(结合属性使用):

driver.findElement(By.xpath("//input[@value='查询']"));

 在代码中找所有input标签中,属性值是查询的input标签,也可以省略标签:

driver.findElement(By.xpath("//*[@value='查询']"));

 也可以将多个条件填入[ ]中,就可以限制多个条件下进行查找:

driver.findElement(By.xpath("//input[@id='kw' and @class='su']"));

使用索引定位:

WebElement button= driver.findElement(By.xpath("//input[1]"));

 这样就锁定了所有标签中的第一个标签。

模糊的属性值:

WebElement button= driver.findElement(By.xpath("//img[starts-with(@alt,'div1')]"));

By.xpath("//input[ends-with(@id,'很漂亮')]");(无效)

WebElement button= driver.findElement(By.xpath("//img[contains(@alt,'div1')]"));

有的时候,第一次打开网页,标签中的属性值alt是div1,第二次打开网页alt就变成了div2。这种情况下,就用到了stars-with,确保在属性多次变动的时候能根据第一次不变的特点找到元素。有start-with也有ned-with,不过end-with已经是无效方法了。那么在属性多次变动的过程中,contains可以保证alt一变为div1,就锁定元素。

使用页面元素文本定位:

driver.findElement(By.xpath("//a[text()='hao123']")).click();
driver.findElement(By.xpath("//a[contains(text(),'hao')]")).click();

(8)CSS 

绝对路径(不推荐):

WebElement userName = driver.findElement(By.cssSelector("html body div div form input"));

WebElement userName = driver.findElement(By.cssSelector("html >body > div > div > form > input"));

By.cssSelector("html>body>div[1]>input[type='button']"));

相对路径(结合属性):

// class属性
By.cssSelector("input.spread");

// id属性
By.cssSelector("input#divinput");

// 复合属性
By.cssSelector("img[alt='aaa'][href='****']");

// 模糊匹配
// 1、开头包含
a[href ^= 'http://www.baidu']

// 2、结尾包含
a[href $= 'baidu.com']

// 3、包含
a[href *= 'baidu']

// 子页面元素的查找
By.cssSelector("div#div1>input#divinput1");

总结:在进行元素定位的时候,xpath使用的情况较多。像className、tagName由于可重复的特点,不方便直接锁定元素。css定位速度             比xpath快。

对比css和xpath:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值