[JAVA 4#] [Web Automation 4#] Controlling STEEMIT web pages with Selenium #2 Find Elements [CN]
image source: pixabay
今天探索一下Selenium函数。控制网页的基础则是查找元素,浏览器的开发者模式可以查看html代码。
回到代码简单写下代码吧。Selenium提供 findElement, findElements 两个函数,前者返回WebElement
对象,后者返回List<WebElement>
。 参数是Selenium 的By类。按(ctrl + space)看一下函数吧。👇
那就看看都有什么函数吧。
- By.className - 网页元素包含很多属性,最常用的属性之一叫class,这个函数可以用这个属性来查找元素。
- By.cssSelector - 随着网页元素非常越来越复杂,查找元素的方法也渐渐增多。cssSelector也是其中之一。css Selector 语法可以参考这里。
- By.id - 与class一样也是一个属性,不同之处是id值是独一无二的值。这个性质可以简单的查找元素但也有副作用。很多web开发者很少用id来开发,还有一点就是这个id值有可能是可变量,所以我很少调用这个函数。
- By.linkText - 可以用有超链接的a标签里的文本查找元素,值必须完全匹配才行。
- By.partialLinkText - 与上述函数差不多,但这个不用完全匹配,部分匹配也可以查找。
- By.name - 也是一个属性,可以用name值来查找元素。
- By.tagName - 用标签名查找。网页里有很多同名标签,所以一般不能用此函数。
- By.xpath - 与 cssSelector 类似,也是查找元素的一种方法。学会复杂的语法可以很容易的查找元素。也是我最常用的方法,因为 xpath 语法包括 ancestor, descendant, following-sibling, preceding-sibling 等关键词,还支持text(), contains() 等函数,自由度非常高。
👆 使用方法如图。
那下一步呢,研究一下附加的函数。findElement() 函数后加.可以呼叫附加的函数。值研究WebElement 接口下的函数吧。
- clear() - 如果是输入框的话可以清空值。
- click() - 不用多说,就是可以点击元素。
- findElement()/findElements() - findElement() 后还可以加同样的函数来查找子孙元素。
- getAttribute() - 返回元素的属性值。
- getCssValue() - 返回属性的css属性,参数传如color等css属性就可返回值。
- getLocation - 返回元素的位置。
- getRect() - 返回元素的位置和大小。
- getSize() - 返回元素的大小。
- getTagName() - 返回标签名。
- getText() - 返回标签内部文本。
- isDisplayed() - 返回元素是否显示在页面的bool值。
- isEnabled() - 返回元素是否激活的bool值。
- isSelected() - 复选框,单选框,下拉框等元素的被选中状态的bool值。
- sendKeys() - 王元素输入文本时使用该函数。可以输入键盘上所有的键,
- submit() - 元素如果位于form中可以往server提交。
这些是 findElement的附加函数。findElements()就不说了。因为类型是JAVA 的List 对象。
下面调用 findElement, findElements 两个函数在 steemit 页面获取帖子目录并把标题和作者名输入到控制台。
package com.steem.webatuo;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import io.github.bonigarcia.wdm.WebDriverManager;
public class Steemit {
public static void main(String[] args) throws InterruptedException {
WebDriverManager.chromedriver().setup();
WebDriver driver = new ChromeDriver();
driver.get("steemit.com/@june0620/feed");
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
List<WebElement> list = driver.findElements(By.xpath("//div[@id='posts_list']/ul/li"));
for(WebElement post : list) {
String title = post.findElement(By.xpath("descendant::h2/a")).getText();
String author = post.findElement(By.xpath("descendant::span[@class='user__name']")).getText();
System.out.println(author + "님의 글: " + title);
}
driver.quit();
}
}
视频:
!thumbup
恭喜你!您的这篇文章入选 @justyy 今日 (2020-01-25) 榜单 【优秀的文章】, 回复本条评论24小时内领赏,点赞本评论将支持 @dailychina 并增加将来您的奖赏。
@justyy 是CN区的见证人,请支持他,给他投票,或者设置justyy为见证人代理。感谢!@justyy的主要贡献:https://steemyy.com
Congratulations! This post has been selected by @justyy as today's (2020-01-25) 【Good Posts】, Steem On! Reply to this message in 24 hours to get rewards. Upvote this comment to support the @dailychina and increase your future rewards! ^_^
SteemIt 工具、API接口、机器人和教程
SteemIt Tools, Bots, APIs and Tutorial
If you believe what I am doing, please consider a spare vote voting me here, thank you very much indeed.
@justyy - the author of https://SteemYY.com and I have been a Steem Witness for more than a year now.
谢谢~~
@tipu curate
帅哥新年好😁 心想事成💕🌹
Posted using Partiko Android
Upvoted 👌 (Mana: 10/15 - need recharge?)
美女也新年快乐🎉,合家欢乐🎵,身体健康😃
Posted using Partiko Android
吃了吗?请支持中文区的见证人, @abit @bobdos @ety001 @justyy @oflyhigh @partiko (首字母顺序),全投,一个都不要漏。感谢支持。