c#抓取网页数据(经@吃西瓜的星星提醒(2):SeleniumSelenium)
优采云 发布时间: 2021-11-19 02:03c#抓取网页数据(经@吃西瓜的星星提醒(2):SeleniumSelenium)
@吃瓜的星提醒
首先我们介绍Selenium
Selenium 也是一种用于 Web 应用程序测试的工具。Selenium 测试直接在浏览器中运行,就像真正的用户在操作一样。支持的浏览器包括 IE、Mozilla Firefox、Mozilla Suite 等。该工具的主要功能包括: 测试浏览器兼容性——测试您的应用程序是否可以在不同浏览器和操作系统上正常运行。测试系统功能——创建回归测试以验证软件功能和用户需求。支持自动录制动作和自动生成。测试Net、Java、Perl等不同语言的脚本。Selenium是ThoughtWorks专门为web应用编写的验收测试工具。
单击此处了解详细信息
这里我们将使用模拟真人操作,不会被TX统一用于访问和数据捕获。
这里使用的IDE是VS2017,系统是Win10,浏览器驱动是ChromeDriver
新的单元测试解决方案
安装 Nuget 包
我这里用的是谷歌浏览器采集数据,所以我用的是谷歌浏览器的驱动。如果你不喜欢谷歌浏览器,你可以参考其他驱动程序包。
命令
Install-Package Selenium.WebDriver
Install-Package Selenium.WebDriver.ChromeDriver
或者直接安装管理器如下图
Selenium.WebDriver.ChromeDriver 是将Chorme驱动,即ChormeDriver.exe程序,在项目编译完成后复制到bin目录下。
将NetCore复制到对应的netcoreappv文件目录下
这样,基本参考就完成了,下面介绍具体的实现。
首先创建一个测试类Qzone.cs,我们后续的所有调用都在测试类中进行测试和实现
public class QzoneTest
{
[Fact]
public void QQLogin()
{
var driver = new ChromeDriver();
driver.Url = "https://qzone.qq.com/";
driver.Quit();
}
}
因为是xUnit测试类,可以直接右键调试测试,运行时可以看到下图
驱动会自动打开Chrome浏览器并跳转到指定页面。
空间页面已经打开,下面是登录步骤
有两种登录方式,也是QQ自己提供的
第一种,如果你已经登录QQ,可以直接点击头像登录
第二种用账号密码登录
下面就来详细介绍一下
让我谈谈第二个。第一个比较简单。学完第二个,第一个就容易了。
我们需要找到输入账号和密码的文本框
这里我们使用Selenium的查找元素的方法
这为我们提供了多种查找元素的方法,我们可以根据名称来理解其含义。
var driver = new ChromeDriver();
driver.FindElement();
driver.FindElementByClassName();
driver.FindElementByCssSelector();
driver.FindElementById();
driver.FindElementByName();
driver.FindElementByTagName();
driver.FindElementByXPath()
我们使用 ByXPath 方法来查找元素。XPath的详细介绍可以自行了解。我只会向您展示如何快速找到 XPath。
只需打开空间地址,找到文本框,然后勾选元素,在右边的元素位置右击->Copy->Copy XPath
可以得到这样的地址
//*[@id="u"]
找密码框的方法一样
//*[@id="p"]
通过这个xpath我们可以找到用户名的xpath路径,然后在程序中这样写
try
{
var userName = driver.FindElementByXPath("//*[@id='u']");
//这里的userName就是用户名的文本框
//设置用户名的值
userName.SendKeys("123456");
var pwd = driver.FindElementByXPath("//*[@id='p']");
pwd.SendKeys("********");
}
finally
{
driver.Quit();
}
运行后出现异常
别慌,这是浏览器驱动没有找到元素造成的,我们仔细检查一下
原来的文本框嵌套在一个iframe中,难怪当前驱动找不到元素,因为当前驱动只会找到当前连接下的元素,不包括嵌套元素。
然后我们使用switch语法
try
{
//切换语法有两种,一种是根据索引切换,另外一种根据iframe名称切换
//这里我们使用name切换
ITargetLocator tagetLocator = driver.SwitchTo();
//tagetLocator.Frame(1); //frame index.
tagetLocator.Frame("login_frame"); //frame frame name.
var userName = driver.FindElementByXPath("//*[@id='u']");
//这里的userName就是用户名的文本框
//设置用户名的值
userName.SendKeys("123456");
var pwd = driver.FindElementByXPath("//*[@id='p']");
pwd.SendKeys("********");
}
finally
{
driver.Quit();
}
然后调试测试,如下图
所以将值填入文本框
最后点击登录,找到login button元素,同样点击找到login button元素,点击
[Fact]
public void QQLogin()
{
dynamic type = (new PictureTest()).GetType();
string currentDirectory = Path.GetDirectoryName(type.Assembly.Location);
var driver = new ChromeDriver(currentDirectory);
driver.Url = "https://qzone.qq.com/";
try
{
//切换语法有两种,一种是根据索引切换,另外一种根据iframe名称切换
//这里我们使用name切换
ITargetLocator tagetLocator = driver.SwitchTo();
//tagetLocator.Frame(1); //frame index.
tagetLocator.Frame("login_frame"); //frame frame name.
var userName = driver.FindElementByXPath("//*[@id='u']");
//这里的userName就是用户名的文本框
//设置用户名的值
userName.SendKeys("123456");
var pwd = driver.FindElementByXPath("//*[@id='p']");
pwd.SendKeys("********");
var btnLogin = driver.FindElementByXPath("//*[@id='login_button']");
//这里是判断登录按钮是否可见,可以不写,直接调用click方法
if (btnLogin != null && btnLogin.Displayed == true)
{
btnLogin.Click();
}
}
finally
{
driver.Quit();
}
}
然后登录成功
总而言之,使用了一些关键语法
//Iframe切换,如果需要捕获的元素不在当前页面,则找到嵌套页面进行切换
//切换语法有两种,一种是根据索引切换,另外一种根据iframe名称切换
ITargetLocator tagetLocator = driver.SwitchTo();
//tagetLocator.Frame(1); //frame index.
tagetLocator.Frame("login_frame"); //frame frame name.
//查找元素方法,可以使用css定位
var userName = driver.FindElementByXPath("//*[@id='u']");
//设置文本框的值SendKeys
userName.SendKeys("123456");
//元素点击事件
var btnLogin = driver.FindElementByXPath("//*[@id='login_button']");
btnLogin.Click();
只要了解驱动对浏览器的一些操作方式,就可以自行探索,实现自己想要的,比如点击切换登录框、快速登录
例如,找到相册元素并点击,找到菜单谈论元素并点击,设置文本框值,发送谈话,写消息,你可以探索和使用
登录先在这里聊,改天写点什么或者留言板,或者保存相册的照片
Git源代码地址: