c#抓取网页数据(经@吃西瓜的星星提醒(2):SeleniumSelenium)

优采云 发布时间: 2021-11-19 02:03

  c#抓取网页数据(经@吃西瓜的星星提醒(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源代码地址:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线