[JAVA 4#] [Web Automation 4#] Controlling STEEMIT web pages with Selenium #2 Find Elements [CN]

in #cn5 years ago

redsjavahouse1591357_1280.jpg
image source: pixabay


今天探索一下Selenium函数。控制网页的基础则是查找元素,浏览器的开发者模式可以查看html代码。
image.png

回到代码简单写下代码吧。Selenium提供 findElement, findElements 两个函数,前者返回WebElement 对象,后者返回List<WebElement>。 参数是Selenium 的By类。按(ctrl + space)看一下函数吧。👇
image.png

那就看看都有什么函数吧。

  1. By.className - 网页元素包含很多属性,最常用的属性之一叫class,这个函数可以用这个属性来查找元素。
  2. By.cssSelector - 随着网页元素非常越来越复杂,查找元素的方法也渐渐增多。cssSelector也是其中之一。css Selector 语法可以参考这里
  3. By.id - 与class一样也是一个属性,不同之处是id值是独一无二的值。这个性质可以简单的查找元素但也有副作用。很多web开发者很少用id来开发,还有一点就是这个id值有可能是可变量,所以我很少调用这个函数。
  4. By.linkText - 可以用有超链接的a标签里的文本查找元素,值必须完全匹配才行。
  5. By.partialLinkText - 与上述函数差不多,但这个不用完全匹配,部分匹配也可以查找。
  6. By.name - 也是一个属性,可以用name值来查找元素。
  7. By.tagName - 用标签名查找。网页里有很多同名标签,所以一般不能用此函数。
  8. By.xpath - 与 cssSelector 类似,也是查找元素的一种方法。学会复杂的语法可以很容易的查找元素。也是我最常用的方法,因为 xpath 语法包括 ancestor, descendant, following-sibling, preceding-sibling 等关键词,还支持text(), contains() 等函数,自由度非常高。

image.png
👆 使用方法如图。

image.png
那下一步呢,研究一下附加的函数。findElement() 函数后加.可以呼叫附加的函数。值研究WebElement 接口下的函数吧。

  1. clear() - 如果是输入框的话可以清空值。
  2. click() - 不用多说,就是可以点击元素。
  3. findElement()/findElements() - findElement() 后还可以加同样的函数来查找子孙元素。
  4. getAttribute() - 返回元素的属性值。
  5. getCssValue() - 返回属性的css属性,参数传如color等css属性就可返回值。
  6. getLocation - 返回元素的位置。
  7. getRect() - 返回元素的位置和大小。
  8. getSize() - 返回元素的大小。
  9. getTagName() - 返回标签名。
  10. getText() - 返回标签内部文本。
  11. isDisplayed() - 返回元素是否显示在页面的bool值。
  12. isEnabled() - 返回元素是否激活的bool值。
  13. isSelected() - 复选框,单选框,下拉框等元素的被选中状态的bool值。
  14. sendKeys() - 王元素输入文本时使用该函数。可以输入键盘上所有的键,
  15. 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();
    }

}

视频:

Sort:  

!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

美女也新年快乐🎉,合家欢乐🎵,身体健康😃

Posted using Partiko Android

吃了吗?请支持中文区的见证人, @abit @bobdos @ety001 @justyy @oflyhigh @partiko (首字母顺序),全投,一个都不要漏。感谢支持。

Coin Marketplace

STEEM 0.19
TRX 0.18
JST 0.034
BTC 89422.86
ETH 3144.72
USDT 1.00
SBD 2.76