摘要

本文主要解决如下3个问题:
1、Selenium怎么获取一个元素的HTML源代码
2、Selenium怎么获取元素下的子元素
3、Selenium怎么判断元素是否存在
4、Selenium通过子元素来 查找 / 定位 父元素

Selenium怎么获取一个元素的HTML源代码

假设需要获取id为articleList的元素的HTML源代码,有两种方法:

方法一

WebElement subTag=driver.findElement(By.id("articleList"));
String contents = liTag.getAttribute("outerHTML");

方法二

WebElement element = driver.findElement(By.id("articleList"));
String contents = (String)((JavascriptExecutor)driver).executeScript("return arguments[0].innerHTML;", element);

相比较而言,方法一更为简洁。

Selenium怎么获取元素下的子元素

Selenium提供了以下8个方法来查找页面中的1个元素:

Selenium方法 Java方法
find_element_by_id driver.findElement(By.id())
find_element_by_name driver.findElement(By.name())
find_element_by_xpath driver.findElement(By.xpath()
find_element_by_link_text driver.findElement(By.linkText()
find_element_by_partial_link_text driver.findElement(By.partialLinkText()
find_element_by_tag_name driver.findElement(By.tagName()
find_element_by_class_name driver.findElement(By.className()
find_element_by_css_selector driver.findElement(By.cssSelector()

以下7个方法来查找页面中的多个元素(这些方法将返回一个列表):

Selenium方法 Java方法
find_elements_by_name driver.findElements(By.name())
find_elements_by_xpath driver.findElements(By.xpath()
find_elements_by_link_text driver.findElements(By.linkText()
find_elements_by_partial_link_text driver.findElements(By.partialLinkText()
find_elements_by_tag_name driver.findElements(By.tagName()
find_elements_by_class_name driver.findElements(By.className()
find_elements_by_css_selector driver.findElements(By.cssSelector()

上述方法都是查找页面中的元素的,那么怎么获取一个元素下的子元素呢?其实和获取页面元素类似,以获取parentElement元素下的所有a标签为例:

List<WebElement> aTags = parentElement.findElements(By.tagName("a"));

还有一种是根据xpath查找子元素的方法

代码示例:

//页面上class=ReactVirtualized__Grid__innerScrollContainer的div元素下有多个/div/div结构,查找/div/div结构下的子元素

List<WebElement> elements=webDriver.findElements(By.xpath("//div[@class='ReactVirtualized__Grid__innerScrollContainer']/div/div"));

for (WebElement webElement : elements) {
WebElement aElement=webElement.findElement(By.xpath("div/div/h2/a"));
System.out.println(aElement.getText());
}

总结:获取页面元素的15个方法都可以用来获取元素下的子元素。

Selenium怎么获取判断元素是否存在

Selenium 中并没有直接判断元素是否存在的方法,只能通过变通的方式判断。

方法一

调用findElement方法获取元素,如果抛出异常,就可以判断为元素不存在。

try {
webDriver.findElement(by);
return true;
} catch (Exception e) {
System.out.println("不存在此元素");
return false;
}

方法二

通过判断元素个数的方式来判断。

WebDriver的findElements()返回一个List元素集合,通过找到元素的size()判断,如果<=0则元素不存在,否则元素存在。另外,findElements方法找不到元素时会返回一个空List,所以不需要进行null判断。

/**
* 判断某个元素是否存在
*/
public boolean isElementExists(WebDriver webDriver, By by) {
if(webDriver.findElements(by).size()>0){
return true;
}else{
return false;
}
}

显然,相比抛异常进行判断,方法二更为合适,可以直接写进工具类里方便调用。

Selenium通过子元素来查找/定位父元素

selenium通过父元素来找子元素的方式 很简单,但是反过来 如果通过子元素来找父元素  就不一样了 有的场景是需要通过子元素来找父元素

直接上代码

这个时候该怎么做呢  我们可以通过获取文本的内容进行定位向上找  (//..) 这个是上一级

driver.findElementByXpath('xpath', '//*[text()="北京分公司"]//..//../span')

这个时候定位的目标就在

就找到父元素了