进入5月各市的专业技术人员继续教育又开始了,其实课程讲的都很好,值得一听,但是总是弹出回答问题的窗口,每一个课程之间不能自动跳转,我利用c#的winform程序实现了自动切换课程和自动点回答弹窗问题,其实代码比较简单,就是利用谷歌浏览器的自动点击功能来实现的,其实其他方法也可以实现 提交post请求,分析json,都可实现,我用了一个比较懒得方法。
1、代码用到了http://chromedriver.storage.googleapis.com/index.html 谷歌浏览器的chromedriver.exe,软件根目录。
2、安装nuget包Selenium和HtmlAgilityPack,其实基本是个爬虫了。
3、这里我不适用options.AddArgument("headless");状态了,用起来比较直观。
4、建立IWebDriver实例,代码如下:
[C#] 纯文本查看 复制代码 string get_code_url = "https://www.xxxx.com/";
options = new ChromeOptions();
//options.AddArgument("headless");
options.AddArgument("no-sandbox");
options.AddArgument("disable-dev-shm-usage");
options.PageLoadStrategy = PageLoadStrategy.Normal;
options.AddArgument("disable-infobars");
options.AddArgument("user-agent='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3880.400 QQBrowser/10.8.4554.400'");
options.AddArgument("Accept='text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8'");
//driverService.HideCommandPromptWindow = true;//关闭黑色cmd窗口
CDS = ChromeDriverService.CreateDefaultService();
//是否应隐藏服务的命令提示符窗口
CDS.HideCommandPromptWindow = true;
CDS.Start();
webDriver = new ChromeDriver(CDS, options);
webDriver.Navigate().GoToUrl(get_code_url);
5、后面就是利用浏览器的审查元素分析xpath来进行点击了,点击代码如下
[C#] 纯文本查看 复制代码 webDriver.FindElement(By.XPath("xpath代码")).Click();
6、课程切换代码如下和点击弹窗代码如下,主要是用HtmlAgilityPack分析网页元素,找到索要点击的地方的xpath:
[C#] 纯文本查看 复制代码 foreach (var nodee in nodes1)
{
webDriver.FindElement(By.XPath(nodee.XPath)).Click();
var nodes2 = nodee.SelectNodes("//*[@class='sonUl width100 customScrollBar none']");
foreach (var nodeb in nodes2)
{
var n = nodeb.SelectNodes("//*[@class='sonLi width100']");
foreach (var nodec in n)
{
webDriver.FindElement(By.XPath(nodec.XPath)).Click();
while (true)
{
Thread.Sleep(60000);
var html2= webDriver.PageSource;
if (html2.Contains("课堂问答") && html2.Contains("pv-playpause pv-iconfont pv-icon-btn-play"))
{
doc1.LoadHtml(html2);
HtmlNode nodeask = doc1.GetElementbyId("ulList");
//var nodesask = nodeask.SelectNodes("//*/input[@type='radio']");
var nodesask = nodeask.SelectNodes("//*[@class='pv-ask-form']");
foreach (var ask in nodesask)
{
if (!webDriver.PageSource.Contains("课堂问答"))
{
break;
}
webDriver.FindElement(By.XPath(ask.XPath)).Click();
Thread.Sleep(1000);
doc1.LoadHtml(html2);
HtmlNode nodesub = doc1.GetElementbyId("ulList");
var nodesask1 = nodesub.SelectNodes("//*[@data-type='pvSubmit']");
foreach (var ask1 in nodesask1)
{
webDriver.FindElement(By.XPath(ask1.XPath)).Click();
}
Thread.Sleep(20000);
}
Thread.Sleep(3000);
}
else
{
var html3= webDriver.PageSource;
if (html3.Contains("pv-playpause pv-iconfont pv-icon-btn-play") && !html3.Contains("课堂问答"))
{
string a = null;
string b = null;
doc1.LoadHtml(html3);
HtmlNode nodejixu = doc1.GetElementbyId("ulList");
var nodesask2 = nodejixu.SelectNodes("//*[@class='pv-playpause pv-iconfont pv-icon-btn-play']");
var nodesj = nodejixu.SelectNodes("//*[@class='pv-time-duration']");
var nodesjs = nodejixu.SelectNodes("//*[@class='pv-time-current']");
foreach (var js in nodesjs)
{
a = js.InnerText;
}
foreach (var jj in nodesj)
{
b = jj.InnerText;
}
if (a.Equals(b)) { break; }
foreach (var ask1 in nodesask2)
{
webDriver.FindElement(By.XPath(ask1.XPath)).Click();
}
}
}
}
}
}
}
7、测试了两天,唯一的bug就是谷歌浏览器有时候崩溃,查了一下资料说谷歌浏览器有内存泄漏的问题,长时间打开会崩溃。解决办法可以使用options.AddArgument("headless");在关闭浏览器的状态下运行程序,但是有时候会不方便,如果配合winform窗体显示一下程序运行的状态就好一些了。希望和大家交流,谢谢。 |