id
linktext
partiallinktext
name
tagname
xpath
classname
cssselector
这些方法可以在org.openqa.selenium.by中找到,下面一一道来;
假如有这样的需求:登录安居客网站,搜索陆家嘴附近的二手房源,网页是这样的
这个需求涉及到一个输入框和一个提交按钮,先查看网页源码
在输入框中输入“陆家嘴”然后点击“二手房”按钮,如果能跳转到陆家嘴相关页面就完成了这个需求,我们尝试用webdriver提供的元素定位方法来解决
id
id是唯一标识,通过id来定位是非常快速和准确的
import org.openqa.selenium.by;import org.openqa.selenium.webdriver; import org.openqa.selenium.chrome.chromedriver; import org.openqa.selenium.webelement; public class newtest { public static void main(string[] args) { system.setproperty(webdriver.chrome.driver, c:\\program files (x86)\\google\\chrome\\application\\chromedriver.exe); webdriver driver = new chromedriver(); driver.get(http://anjuke.com); //id webelement text=driver.findelement(by.id(glb_search0)); text.sendkeys(陆家嘴); webelement button=driver.findelement(by.id(btnsubmit)); button.click(); if(driver.gettitle().contains(陆家嘴)) system.out.print(搜索成功,当前页面为+driver.gettitle()); else system.out.print(搜索失败,当前页面为+driver.gettitle()); driver.quit(); } }
name
提交表单时可以通过name属性获取数据,较id来说并不常用,有id属性时建议优先使用id属性,上面的源码中text输入框是有name属性的,button依然用id来获取(当然,如果测试需要的话可以修改源码,没有修改源码权限的自动化测试是很难进行的)。
import org.openqa.selenium.by;import org.openqa.selenium.webdriver; import org.openqa.selenium.chrome.chromedriver; import org.openqa.selenium.webelement; public class newtest { public static void main(string[] args) { system.setproperty(webdriver.chrome.driver, c:\\program files (x86)\\google\\chrome\\application\\chromedriver.exe); webdriver driver = new chromedriver(); driver.get(http://anjuke.com); //name webelement text=driver.findelement(by.name(kw)); text.sendkeys(陆家嘴); webelement button=driver.findelement(by.id(btnsubmit)); button.click(); if(driver.gettitle().contains(陆家嘴)) system.out.print(搜索成功,当前页面为+driver.gettitle()); else system.out.print(搜索失败,当前页面为+driver.gettitle()); driver.quit(); } }
tagname
tagname一般用来获取批量数据,如统计页面链接数,输入框数量等等,用tagname来定位单一元素有点麻烦
import java.util.list;import org.openqa.selenium.by;import org.openqa.selenium.webdriver; import org.openqa.selenium.chrome.chromedriver; import org.openqa.selenium.webelement; public class newtest { public static void main(string[] args) { system.setproperty(webdriver.chrome.driver, c:\\program files (x86)\\google\\chrome\\application\\chromedriver.exe); webdriver driver = new chromedriver(); driver.get(http://anjuke.com); list inputs=driver.findelements(by.tagname(input)); for(int index=0;index
当标签具有class属性时也可使用classname来定位,不过要注意class的值不是唯一的findelement方法返回匹配到的第一个元素
import org.openqa.selenium.by;import org.openqa.selenium.webdriver; import org.openqa.selenium.chrome.chromedriver; import org.openqa.selenium.webelement; public class newtest { public static void main(string[] args) { system.setproperty(webdriver.chrome.driver, c:\\program files (x86)\\google\\chrome\\application\\chromedriver.exe); webdriver driver = new chromedriver(); driver.get(http://anjuke.com); //classname webelement text=driver.findelement(by.classname(kw)); text.sendkeys(陆家嘴); webelement button=driver.findelement(by.classname(btn)); button.click(); if(driver.gettitle().contains(陆家嘴)) system.out.print(搜索成功,当前页面为+driver.gettitle()); else system.out.print(搜索失败,当前页面为+driver.gettitle()); driver.quit(); } }
xpath
xpath相关教程可以参考w3school上的教程,为了程序的统一性,平时工作中我都是使用xpath来定位元素的
import org.openqa.selenium.by;import org.openqa.selenium.webdriver; import org.openqa.selenium.chrome.chromedriver; import org.openqa.selenium.webelement; public class newtest { public static void main(string[] args) { system.setproperty(webdriver.chrome.driver, c:\\program files (x86)\\google\\chrome\\application\\chromedriver.exe); webdriver driver = new chromedriver(); driver.get(http://anjuke.com); //xpath webelement text=driver.findelement(by.xpath(//input[@id='glb_search0'])); text.sendkeys(陆家嘴); webelement button=driver.findelement(by.xpath(//input[@id='btnsubmit'])); button.click(); if(driver.gettitle().contains(陆家嘴)) system.out.print(搜索成功,当前页面为+driver.gettitle()); else system.out.print(搜索失败,当前页面为+driver.gettitle()); driver.quit(); } }
cssselector
cssselector教程可以参考css3-selectors,cssselector和xpath应该是实际工作中用的最多的定位方法了,两者没有优劣之分,看个人喜好吧。
import org.openqa.selenium.by;import org.openqa.selenium.webdriver; import org.openqa.selenium.chrome.chromedriver; import org.openqa.selenium.webelement; public class newtest { public static void main(string[] args) { system.setproperty(webdriver.chrome.driver, c:\\program files (x86)\\google\\chrome\\application\\chromedriver.exe); webdriver driver = new chromedriver(); driver.get(http://anjuke.com); //cssselector webelement text=driver.findelement(by.cssselector(input[id='glb_search0'])); text.sendkeys(陆家嘴); webelement button=driver.findelement(by.cssselector(input[id='btnsubmit'])); button.click(); if(driver.gettitle().contains(陆家嘴)) system.out.print(搜索成功,当前页面为+driver.gettitle()); else system.out.print(搜索失败,当前页面为+driver.gettitle()); driver.quit(); } }
linktext和partiallinktext
linktext和partiallinktext用来定位网页中的超链接,需要a标签中的全部或部分内容即可。例如,需要访问热门版块中的古美罗阳可以这样定位
import org.openqa.selenium.by;import org.openqa.selenium.webdriver; import org.openqa.selenium.chrome.chromedriver; import org.openqa.selenium.webelement; public class newtest { public static void main(string[] args) { system.setproperty(webdriver.chrome.driver, c:\\program files (x86)\\google\\chrome\\application\\chromedriver.exe); webdriver driver = new chromedriver(); driver.get(http://anjuke.com); //linktext webelement a=driver.findelement(by.linktext(古美罗阳)); a.click(); //partiallinktext //webelement a=driver.findelement(by.partiallinktext(古美)); //a.click(); if(driver.gettitle().contains(古美罗阳)) system.out.print(访问成功,当前页面为+driver.gettitle()); else system.out.print(访问失败,当前页面为+driver.gettitle()); driver.quit(); } }
层级定位
webdriver提供了层级定位的方式即通过父元素访问其子元素,比如,输出热门版块下的所有版块
import java.util.list;import org.openqa.selenium.by;import org.openqa.selenium.webdriver; import org.openqa.selenium.chrome.chromedriver; import org.openqa.selenium.webelement; public class newtest { public static void main(string[] args) { system.setproperty(webdriver.chrome.driver, c:\\program files (x86)\\google\\chrome\\application\\chromedriver.exe); webdriver driver = new chromedriver(); driver.get(http://anjuke.com); webelement element=driver.findelement(by.xpath(//div[@id='content_rd0']/dl[@class='dl0']/dd)); list links=element.findelements(by.tagname(a)); for(int index=0;index