成成果果 發表於 2020-6-10 19:44:00

C#爬虫(03):使用Selenium

<h2>一、介绍:</h2>
<p>Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。</p>
<p><strong>1、Selenium Webdriver</strong>(也就是<strong>Selenium2,Selenium3</strong>)和<strong>Selenium RC</strong>(<strong>Selenium 1</strong>)一样提供了<strong>web</strong>自动化的各种语言调用接口库。相比<strong>Selenium RC</strong>,<strong>Selenium WebDriver</strong>的编程接口更加直观易懂,也更加简练。</p>
<p>但是和<strong>Selenium RC</strong>不同的是,<strong>Selenium Webdriver</strong>是通过各种浏览器的驱动(<strong>web driver</strong>)来驱动浏览器的,而不是通过注入<strong>JavaScript</strong>的方式。</p>
<p>我们的代码运行起来是一个进程,里面调用<strong>Selenium WebDriver</strong>的库和各个浏览器的驱动进程 进行交互,传递<strong>Selenium</strong>命令 给它们,并且获取命令执行的结果,返回给我们的代码进行处理。</p>
<p><strong>2、Selenium WebDriver</strong>目前包括两个版本<strong>Selenium 2</strong>和<strong>Selenium 3</strong>。这两个版本从开发代码调用接口上来看,几乎没什么区别。区别在于库的实现和<strong>web driver</strong>的实现。</p>
<p><strong>S<strong>elenium2</strong>是<strong>Selenium</strong>组织帮各种浏览器写<strong>web driver</strong>的,而<strong>Selenium 3</strong>里面的<strong>web driver</strong>是由各个浏览器厂商(<strong>Apple,Google,Microsoft,Mozilla</strong>)自己提供的。所以<span style="background-color: rgba(255, 255, 0, 1)"><strong>Selenium 3</strong>的自动化效率更高,成功率也更高。</span></strong></p>
<p><strong>3、Selenium WebDriver</strong> 支持浏览器众多:</p>
<ul>
<li>Google Chrome</li>
<li>Microsoft Internet Explorer 7,8,9,10,11在 Windows Vista,Windows 7,Windows 8,Windows 8.1.</li>
<li>Microsoft Edge</li>
<li>Firefox</li>
<li>Safari</li>
<li>Opera</li>
</ul>
<p>利用它可以驱动浏览器执行特定的动作,如点击、下拉等操作,同时还可以获取浏览器当前呈现的页面的源代码 ,做到可见即可爬。</p>
<p>所以Selenium现在被广泛用于Python爬虫。查了下资料,发现这个工具确实强大,最重要的是,C#也是可以调用的。</p>
<p>官方支持Java,C#,Python,Ruby,PHP,Perl,Javascript等语言</p>
<p>官方文档(有C#示例):https://www.selenium.dev/documentation/en/</p>
<h3><strong>1、安装Selenium:</strong></h3>
<p>1、我们新建一个C#控制台程序</p>
<p>2、使用Nuget搜索以下依赖库</p>
<p>需要引用的核心库是<strong>Selenium.RC,Selenium.Support,Selenium.WebDriver</strong></p>
<p>然后再需要引用浏览器驱动库,这里我以新版Edge浏览器为例,新版Edge使用方式跟Chrome是一样的,程序包名称为Selenium.WebDriver.MSEdgeDriver。</p>
<p><img src="https://img2020.cnblogs.com/blog/24244/202006/24244-20200611095634726-1698320399.png" alt="image" width="1024" height="470" title="image" border="0" style="border: 0 currentColor; display: inline; background-image: none; border-image: none"> <br>备注:也可以在微软WebDriver官网下载Edge (Chromium)的webdriver,需要和当前浏览器版本一致。然后下载放置到项目可执行文件的目录。</p>
<p>如果使用Chrome:</p>
<p>先查下本机Chrome的版本</p>
<p><img src="https://img2020.cnblogs.com/blog/24244/202006/24244-20200611142454244-2135433522.png" alt="image" width="885" height="246" title="image" border="0" style="margin: 0; border: 0 currentColor; display: inline; background-image: none; border-image: none"></p>
<p>然后去Nuget搜索Selenium.WebDriver.ChromeDriver进行下载安装。</p>
<p>注意:webdriver版本只需要和当前浏览器主版本一致即可。</p>
<p><img src="https://img2020.cnblogs.com/blog/24244/202006/24244-20200611142455005-2072668419.png" alt="image" width="665" height="294" title="image" border="0" style="border-width: 0; display: inline; background-image: none; border-image: none"></p>
<p>3、在Main函数中输入以下代码</p>
<div class="cnblogs_code" style="padding: 5px; border: 1px solid rgba(204, 204, 204, 1); background-color: rgba(245, 245, 245, 1); border-image: none">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> OpenQA.Selenium;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> OpenQA.Selenium.Edge;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Windows.Forms;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> WinForm2
{
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">partial</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Form1 : Form
    {
      </span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> Form1()
      {
            InitializeComponent();
      }

      </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span> Form1_Load(<span style="color: rgba(0, 0, 255, 1)">object</span><span style="color: rgba(0, 0, 0, 1)"> sender, EventArgs e)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> service = <span style="background-color: rgba(255, 255, 0, 1)">EdgeDriverService.CreateDefaultService(<span style="color: rgba(128, 0, 0, 1)">@"</span><span style="color: rgba(128, 0, 0, 1)">.</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">msedgedriver.exe</span><span style="color: rgba(128, 0, 0, 1)">"</span></span><span style="color: rgba(0, 0, 0, 1)"><span style="background-color: rgba(255, 255, 0, 1)">);</span>
            </span><span style="color: rgba(0, 0, 255, 1)">using</span> (IWebDriver driver = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> <span style="background-color: rgba(255, 255, 0, 1)">OpenQA.Selenium.Edge.EdgeDriver(service))</span>
            {
                <span style="background-color: rgba(255, 255, 0, 1)">driver.Navigate().GoToUrl</span>(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http://www.baidu.com</span><span style="color: rgba(128, 0, 0, 1)">"</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">driver.Url = "</span><span style="color: rgba(0, 128, 0, 1); text-decoration: underline">http://www.baidu.com</span><span style="color: rgba(0, 128, 0, 1)">"是一样的</span>
                <span style="color: rgba(0, 0, 255, 1)">var</span> source =<span style="color: rgba(0, 0, 0, 1)"> driver.PageSource;
                </span><span style="color: rgba(0, 0, 255, 1)">this</span>.textBox1.Text =<span style="color: rgba(0, 0, 0, 1)"> source;
            }
      }
    }
}</span></pre>
</div>
<p>如果是Chrome浏览器,可以这样:</p>
<div class="cnblogs_code" style="padding: 5px; border: 1px solid rgba(204, 204, 204, 1); background-color: rgba(245, 245, 245, 1); border-image: none">
<pre>IWebDriver driver = <span style="color: rgba(0, 0, 255, 1)"><span style="background-color: rgba(255, 255, 0, 1)">new</span></span><span style="color: rgba(0, 0, 0, 1)"><span style="background-color: rgba(255, 255, 0, 1)"> OpenQA.Selenium.Chrome.ChromeDriver();</span>
driver.Navigate().GoToUrl(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http://www.baidu.com</span><span style="color: rgba(128, 0, 0, 1)">"</span>);</pre>
</div>
<p>运行,会弹出IE浏览器,网页加载完成后,浏览器会自动关闭。控制台输入结果如下</p>
<p><img src="https://img2020.cnblogs.com/blog/24244/202006/24244-20200611095635810-2113826647.png" alt="image" width="752" height="490" title="image" border="0" style="margin: 0; border: 0 currentColor; display: inline; background-image: none; border-image: none"></p>
<p>这样我们就可以轻松的获取动态渲染页面的源码。</p>
<h2>二、等待</h2>
<p>常用的等待分为<strong>显示等待WebDriverWait()</strong>、<strong>隐式等待ImplicitlyWait()</strong>、<strong>强制等待sleep()</strong>三种,下面我们就分别介绍一下这三种等待的区别</p>
<ol>
<li><strong>Sleep</strong>(): 强制等待,设置固定休眠时间。</li>
<li><strong>ImplicitlyWait</strong>():隐式等待,也叫智能等待,是 webdirver 提供的一个超时等待。隐的等待一个元素被发现,或一个命令完成。如果超出了设置时间的则抛出异常。</li>
<li><strong>WebDriverWait</strong>():显示等待,同样也是 webdirver 提供的方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。默认检测频率为0.5s,默认抛出异常为:NoSuchElementException</li>
</ol>
<h3>1、<strong>隐式等待:</strong>ImplicitlyWait</h3>
<p>用到Timeouts对象。这个对象是用来对设置器进行一些设置的。</p>
<ul>
<li>ImplicitlyWait:设置脚步在查找(定位)元素时最大的超时时间。如FindElement()方法在一些超大网页中进行定位时的超时时间。</li>
<li>PageLoad:设置页面操作超时时间(不是页面加载时间)。是在页面进行跳转操作或刷新操作时的等待时间。如Navigation对象的各种操作方法,以及在页面上进行某种操作后的等待时间。</li>
<li>AsynchronousJavaScript: 设置脚步异步执行的超时时间。</li>
</ul>
<p>代码如下:</p>
<div class="cnblogs_code" style="padding: 5px; border: 1px solid rgba(204, 204, 204, 1); background-color: rgba(245, 245, 245, 1); border-image: none">
<pre>driver.Navigate().GoToUrl(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http://www.baidu.com</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
ITimeouts timeouts </span>=<span style="color: rgba(0, 0, 0, 1)"><span style="background-color: rgba(255, 255, 0, 1)"> driver.Manage().Timeouts();</span>

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置查找元素最大超时时间为30秒</span>
timeouts.<span style="background-color: rgba(255, 255, 0, 1)">ImplicitWait</span> = <span style="color: rgba(0, 0, 255, 1)">new</span> TimeSpan(<span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">30</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置页面操作最大超时时间为30秒</span>
timeouts.<span style="background-color: rgba(255, 255, 0, 1)">PageLoad</span> = <span style="color: rgba(0, 0, 255, 1)">new</span> TimeSpan(<span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">30</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置脚本异步最大超时时间为30秒</span>
timeouts.<span style="background-color: rgba(255, 255, 0, 1)">AsynchronousJavaScript</span> = <span style="color: rgba(0, 0, 255, 1)">new</span> TimeSpan(<span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">30</span>);</pre>
</div>
<h3>2、<strong>显示等待:WebDriverWait()</strong></h3>
<div class="cnblogs_code" style="padding: 5px; border: 1px solid rgba(204, 204, 204, 1); background-color: rgba(245, 245, 245, 1); border-image: none">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">等待页面元素加载完成
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">默认等待100秒</span>
WebDriverWait <span style="background-color: rgba(255, 255, 0, 1)">wait = <span style="color: rgba(0, 0, 255, 1)">new</span> WebDriverWait</span>(driver, TimeSpan.FromSeconds(<span style="color: rgba(128, 0, 128, 1)">100</span><span style="color: rgba(0, 0, 0, 1)">));
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">等待页面上ID属性值为submitButton的元素加载完成</span>
IWebElement myElement = <span style="background-color: rgba(255, 255, 0, 1)">wait.Until</span>((d) =&gt;<span style="color: rgba(0, 0, 0, 1)">
{
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> d.FindElement(By.Id(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">submitButton</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">));
});</span></pre>
</div>
<h2>三、查找(定位对象)</h2>
<p>通过FindElement()这个方法来查找的。然后把参数传递过去。</p>
<div class="cnblogs_code" style="padding: 5px; border: 1px solid rgba(204, 204, 204, 1); background-color: rgba(245, 245, 245, 1); border-image: none">
<pre>driver.<span style="background-color: rgba(255, 255, 0, 1)">FindElement</span>(By.<span style="background-color: rgba(255, 255, 0, 1)">Id</span> (<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">kw</span><span style="color: rgba(128, 0, 0, 1)">"</span>)).SendKeys(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">搜索关键字</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
driver.<span style="background-color: rgba(255, 255, 0, 1)">FindElement</span>(By.Id( </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">su</span><span style="color: rgba(128, 0, 0, 1)">"</span>)).Click();</pre>
</div>
<p>其中By.id("su")就是定位参数,传递一个对象过去。有8种定位方式。传递方式如下图:</p>
<p><img src="https://img-blog.csdn.net/20170112155806962"> <br>注意:其中PartialLinkText是模糊查找。比如百度网页中的关于 参数写“关”就可以了,不用写*这种符号。</p>
<div class="cnblogs_code" style="padding: 5px; border: 1px solid rgba(204, 204, 204, 1); background-color: rgba(245, 245, 245, 1); border-image: none">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">通过ID获取元素</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> byID = driver.FindElement(By.Id(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">cards</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">));

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">通过类名获取元素by class name</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> byClassName = driver.FindElements(By.<span style="background-color: rgba(255, 255, 0, 1)">ClassName</span>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">menu</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">));

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 通过标签名获取元素by tag name </span>
<span style="color: rgba(0, 0, 255, 1)">var</span> byTagName = driver.FindElement(By.<span style="background-color: rgba(255, 255, 0, 1)">TagName</span>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">iframe</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">));

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 通过名字获取元素</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> byName = driver.FindElement(By.Name(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">__VIEWSTATE</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">));

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 通过链接文本获取元素by linked texthttp://www.google.com</span><span style="color: rgba(0, 128, 0, 1)">"&gt;linkedtext</span>&gt;
<span style="color: rgba(0, 0, 255, 1)">var</span> byLinkText = driver.FindElement(By.<span style="background-color: rgba(255, 255, 0, 1)">LinkText</span>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">linkedtext</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">));

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 通过部分链接文本获取元素by partial link text:http://www.google.com</span><span style="color: rgba(0, 128, 0, 1)">"&gt;linkedtext</span>&gt;
<span style="color: rgba(0, 0, 255, 1)">var</span> byPartialLinkText = driver.FindElement(By.<span style="background-color: rgba(255, 255, 0, 1)">PartialLinkText</span>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">text</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">));

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">通过CSS选择器获取元素by css</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> byCss = driver.FindElement(By.<span style="background-color: rgba(255, 255, 0, 1)">CssSelector</span>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">#header .content .logo</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">));

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">通过XPath来获取元素(by xpath</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> byXPath = driver.FindElements(By.<span style="background-color: rgba(255, 255, 0, 1)">XPath</span>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">//div</span><span style="color: rgba(128, 0, 0, 1)">"</span>));</pre>
</div>
<p>各方法使用优先原则:</p>
<p>优先使用id,name,classname,link;次之使用CssSelector();最后使用Xpath();</p>
<p>因为Xpath()方法的性能和效率最低下。</p>
<h2>四、获取页面元素和元素内容</h2>
<h3>1.Title:标题</h3>
<div class="cnblogs_code" style="padding: 5px; border: 1px solid rgba(204, 204, 204, 1); background-color: rgba(245, 245, 245, 1); border-image: none">
<pre>Console.WriteLine(driver.<span style="background-color: rgba(255, 255, 0, 1)">Title</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">输出标题名</span></pre>
</div>
<h3>2.Url:链接</h3>
<div class="cnblogs_code" style="padding: 5px; border: 1px solid rgba(204, 204, 204, 1); background-color: rgba(245, 245, 245, 1); border-image: none">
<pre>Console.WriteLine(driver.<span style="background-color: rgba(255, 255, 0, 1)">Url</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">输出链接</span></pre>
</div>
<h3>3.Text:元素的文本值</h3>
<div class="cnblogs_code" style="padding: 5px; border: 1px solid rgba(204, 204, 204, 1); background-color: rgba(245, 245, 245, 1); border-image: none">
<pre><span style="color: rgba(0, 0, 0, 1)"> Console.WriteLine(web.<span style="background-color: rgba(255, 255, 0, 1)">Text</span>);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">输出元素标记中文本的信息</span></pre>
</div>
<h3>4.Selected勾选情况、TagName标记名标、Enabled编辑状态、Displayed显示状态</h3>
<h3>5.GetAttribute()获取标签的属性</h3>
<div class="cnblogs_code" style="padding: 5px; border: 1px solid rgba(204, 204, 204, 1); background-color: rgba(245, 245, 245, 1); border-image: none">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> byIDAttributeText = byID.<span style="background-color: rgba(255, 255, 0, 1)">GetAttribute</span>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">id</span><span style="color: rgba(128, 0, 0, 1)">"</span>);</pre>
</div>
<h3>6.弹出对话框的处理</h3>
<p>首先,要先了解三种对话框:Alert、Confirmation以及Prompt。测试网页test.html:</p>
<div class="cnblogs_code" style="padding: 5px; border: 1px solid rgba(204, 204, 204, 1); background-color: rgba(245, 245, 245, 1); border-image: none">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">html</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
         <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>这是标题<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">title</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
   <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">head</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>

    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
         <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">input </span><span style="color: rgba(255, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">="button"</span><span style="color: rgba(255, 0, 0, 1)"> onclick</span><span style="color: rgba(0, 0, 255, 1)">="alert('这是Alert');"</span><span style="color: rgba(255, 0, 0, 1)"> value</span><span style="color: rgba(0, 0, 255, 1)">="Alert"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;&lt;</span><span style="color: rgba(128, 0, 0, 1)">br</span><span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
         <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">input </span><span style="color: rgba(255, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">="button"</span><span style="color: rgba(255, 0, 0, 1)"> onclick</span><span style="color: rgba(0, 0, 255, 1)">="confirm('这是confirm');"</span><span style="color: rgba(255, 0, 0, 1)"> value</span><span style="color: rgba(0, 0, 255, 1)">="confirm"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;&lt;</span><span style="color: rgba(128, 0, 0, 1)">br</span><span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
         <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">input </span><span style="color: rgba(255, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">="button"</span><span style="color: rgba(255, 0, 0, 1)"> onclick</span><span style="color: rgba(0, 0, 255, 1)">="prompt('这是Prompt');"</span><span style="color: rgba(255, 0, 0, 1)"> value</span><span style="color: rgba(0, 0, 255, 1)">="prompt"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;&lt;</span><span style="color: rgba(128, 0, 0, 1)">br</span><span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
   <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">body</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>


<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">html</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p>下面进行测试:</p>
<div class="cnblogs_code" style="padding: 5px; border: 1px solid rgba(204, 204, 204, 1); background-color: rgba(245, 245, 245, 1); border-image: none">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> service = EdgeDriverService.CreateDefaultService(<span style="color: rgba(128, 0, 0, 1)">@"</span><span style="color: rgba(128, 0, 0, 1)">.</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">msedgedriver.exe</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
IWebDriver driver </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> OpenQA.Selenium.Edge.EdgeDriver(service);

driver.Navigate().GoToUrl(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">file:///C:/Users/bobin.yang/Source/Repos/WinForm2/bin/Debug/HTMLPage1.html</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);

IWebElement web </span>= driver.FindElement(By.XPath(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">//input</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">));
web.Click();


WebDriverWait wait </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> WebDriverWait(driver, <span style="color: rgba(0, 0, 255, 1)">new</span> TimeSpan(<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">0</span>,<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">));
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Wait for the alert to be displayed</span>
<span style="color: rgba(0, 0, 0, 1)"> wait.Until(ExpectedConditions.AlertIsPresent());

Console.WriteLine(</span><span style="color: rgba(0, 0, 0, 1)">driver.SwitchTo().Alert().Text</span><span style="color: rgba(0, 0, 0, 1)">);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">在接收消息前输出</span>
System.Threading.Thread.Sleep(<span style="color: rgba(128, 0, 128, 1)">1000</span><span style="color: rgba(0, 0, 0, 1)">);
<span style="background-color: rgba(255, 255, 0, 1)">driver.SwitchTo().Alert().Accept();
</span>

IWebElement web2 </span>= driver.FindElement(By.XPath(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">//input</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">));
web2.Click();
WebDriverWait wait2 </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> WebDriverWait(driver, TimeSpan.FromSeconds(<span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">));
wait2.Until(ExpectedConditions.AlertIsPresent());
Console.WriteLine(driver.SwitchTo().Alert().Text);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">在接收消息前输出</span>
System.Threading.Thread.Sleep(<span style="color: rgba(128, 0, 128, 1)">1000</span><span style="color: rgba(0, 0, 0, 1)">);
<span style="background-color: rgba(255, 255, 0, 1)">driver.SwitchTo().Alert().Accept();</span>


IWebElement web3 </span>= driver.FindElement(By.XPath(<span style="color: rgba(128, 0, 0, 1)">@"</span><span style="color: rgba(128, 0, 0, 1)">html/body/input</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">));
web3.Click();
System.Threading.Thread.Sleep(</span><span style="color: rgba(128, 0, 128, 1)">1000</span><span style="color: rgba(0, 0, 0, 1)">);
Console.WriteLine(driver.SwitchTo().Alert().Text);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">在接收消息前输出</span>
<span style="background-color: rgba(255, 255, 0, 1)">driver.SwitchTo().Alert().SendKeys(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">这是输入的内容</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
driver.SwitchTo().Alert().Accept();</span></span></pre>
</div>
<h2>五、操作元素对象WebElement</h2>
<p>主要是进行Click和SendKeys操作,如图。其它的自己查看定义就知道了。 <br><img src="https://img-blog.csdn.net/20170112163055082"></p>
<h3>1、模拟鼠标点击元素</h3>
<div class="cnblogs_code" style="padding: 5px; border: 1px solid rgba(204, 204, 204, 1); background-color: rgba(245, 245, 245, 1); border-image: none">
<pre>driver.FindElement(By.Id(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">copyright</span><span style="color: rgba(128, 0, 0, 1)">"</span>)).<span style="background-color: rgba(255, 255, 0, 1)">Click();</span></pre>
</div>
<ol>
<li>SenKeys就是在定位到输入框后,把参数text赋值进去</li>
<li>Click就是进行鼠标点击操作,比如点击按钮等。和IDE上一样的。单选、复选都是通过这个方法这点击的。</li>
<li>Clear方法:是用于清空输入框的值,和SendKeys正好的作用正好相反。自己测试时,建议先给输入框赋值,再用Thread.Sleep(3000)来暂停一下,再用Clear方法,不然你还没看到效果时,程序已经完成了。</li>
<li>Submit:特殊之处在于,当定位的是Form表单中任何一个元素,当操作完之后,直接调用那个Submit方法就能对整个Form表单完成提交。不用再返回重新查找表单元素。</li>
</ol>
<p><strong>Selenium中在指定的文本框中输入指定的字符串</strong></p>
<div class="cnblogs_code" style="padding: 5px; border: 1px solid rgba(204, 204, 204, 1); background-color: rgba(245, 245, 245, 1); border-image: none">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">在文本框中输入指定的字符串sendkeys()</span>
Driver.FindElement(By.Id(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">tranAmtText</span><span style="color: rgba(128, 0, 0, 1)">"</span>)).<span style="background-color: rgba(255, 255, 0, 1)">SendKeys(“<span style="color: rgba(128, 0, 128, 1)">123456</span>”);</span></pre>
</div>
<h3><strong>2、下拉列表框Select的操作</strong></h3>
<div class="cnblogs_code" style="padding: 5px; border: 1px solid rgba(204, 204, 204, 1); background-color: rgba(245, 245, 245, 1); border-image: none">
<pre>driver.Navigate().GoToUrl(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http://tieba.baidu.com/f/search/adv</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
IList</span> listOption = driver.FindElement(By.Name(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">sm</span><span style="color: rgba(128, 0, 0, 1)">"</span>)).FindElements(By.TagName(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">option</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">));
</span><span style="color: rgba(0, 0, 255, 1)">string</span> targetStr = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">按相关性排序</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">foreach</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> option <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> listOption)
{
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (option.Text == targetStr)<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> if (option.GetAttribute("value").Equals(targetStr))</span>
<span style="color: rgba(0, 0, 0, 1)">      <span style="background-color: rgba(255, 255, 0, 1)">option.Click();</span>
}</span></pre>
</div>
<h3><strong>2、执行JS</strong></h3>
<div class="cnblogs_code" style="padding: 5px; border: 1px solid rgba(204, 204, 204, 1); background-color: rgba(245, 245, 245, 1); border-image: none">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> jsReturnValue = (IWebElement)((IJavaScriptExecutor)driver).<span style="background-color: rgba(255, 255, 0, 1)">ExecuteScript</span>(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">jsfunname</span><span style="color: rgba(128, 0, 0, 1)">"</span>);</pre>
</div>
<h3><strong>3、页面导航 </strong></h3>
<div class="cnblogs_code" style="padding: 5px; border: 1px solid rgba(204, 204, 204, 1); background-color: rgba(245, 245, 245, 1); border-image: none">
<pre><span style="color: rgba(0, 0, 0, 1)">driver.<span style="background-color: rgba(255, 255, 0, 1)">Navigate().Forward();</span>
driver.<span style="background-color: rgba(255, 255, 0, 1)">Navigate().Back();</span></span></pre>
</div>
<p><strong>Selenium中</strong><strong>移动</strong><strong>光标到指定的元素上</strong></p>
<div class="cnblogs_code" style="padding: 5px; border: 1px solid rgba(204, 204, 204, 1); background-color: rgba(245, 245, 245, 1); border-image: none">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">移动光标到指定的元素上perform</span>
Actions action=<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Actions(driver);
action.<span style="background-color: rgba(255, 255, 0, 1)">MoveToElement</span>(Find(By.XPath(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">//input[@id='submit' and @value='确定']</span><span style="color: rgba(128, 0, 0, 1)">"</span>))).Perform();</pre>
</div>
<h3><strong>4、拖拽操作(可以实现滑动验证码的验证)</strong></h3>
<div class="cnblogs_code" style="padding: 5px; border: 1px solid rgba(204, 204, 204, 1); background-color: rgba(245, 245, 245, 1); border-image: none">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> element = driver.FindElement(By.Name(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">source</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">));
IWebElement target </span>= driver.FindElement(By.Name(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">target</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">));
(</span><span style="color: rgba(0, 0, 255, 1)">new</span> Actions(driver)).<span style="background-color: rgba(255, 255, 0, 1)">DragAndDrop</span>(element, target).Perform();</pre>
</div>
<h3><strong>5、模拟鼠标晃动</strong></h3>
<div class="cnblogs_code" style="padding: 5px; border: 1px solid rgba(204, 204, 204, 1); background-color: rgba(245, 245, 245, 1); border-image: none">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">模拟光标晃动movebyoffset()</span>
Actions action = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Actions(driver);
action.<span style="background-color: rgba(255, 255, 0, 1)">MoveByOffse</span><span style="background-color: rgba(255, 255, 0, 1)">t</span>(</span><span style="color: rgba(128, 0, 128, 1)">2</span>, <span style="color: rgba(128, 0, 128, 1)">4</span>);</pre>
</div>
<h3><strong>6、截图功能</strong></h3>
<div class="cnblogs_code" style="padding: 5px; border: 1px solid rgba(204, 204, 204, 1); background-color: rgba(245, 245, 245, 1); border-image: none">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">WebDriver中自带截图功能</span>
Screenshot screenShotFile =<span style="color: rgba(0, 0, 0, 1)"> ((ITakesScreenshot)driver<span style="background-color: rgba(255, 255, 0, 1)">).GetScreenshot();</span>
screenShotFile.SaveAsFile(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">test</span><span style="color: rgba(128, 0, 0, 1)">"</span>, ImageFormat.Jpeg);</pre>
</div>
<h3>7、selenium操作滚轮滑动到底部</h3>
<div class="cnblogs_code">
<pre>driver.execute_script(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">window.scrollTo(0,document.body.scrollHeight);</span><span style="color: rgba(128, 0, 0, 1)">"</span>)</pre>
</div>
<h2><strong>六、获得窗口标识WindowHandles</strong></h2>
<p>要在不同的浏览器窗口之间切换,必须获得不同的窗口(标签)的标识符。用一个集合来保存这些数据。当需要到新窗口里进行操作时,需要将测试器前往新的窗口。开始创建的测试器是对窗口来的,所以当我们需要切换窗口时。需要调用 测试器.SwitchTo().window(获得标识) 这个方法来返回一个新的测试器对象。新的对象是代表的是切换的窗口。代码如下:</p>
<div class="cnblogs_code" style="padding: 5px; border: 1px solid rgba(204, 204, 204, 1); background-color: rgba(245, 245, 245, 1); border-image: none">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> service = EdgeDriverService.CreateDefaultService(<span style="color: rgba(128, 0, 0, 1)">@"</span><span style="color: rgba(128, 0, 0, 1)">.</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">msedgedriver.exe</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
IWebDriver driver </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> OpenQA.Selenium.Edge.EdgeDriver(service);

driver.Navigate().GoToUrl(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http://tieba.baidu.com/f/search/adv</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">找到注册元素</span>
IWebElement register = driver.FindElement(By.XPath(<span style="color: rgba(128, 0, 0, 1)">@"</span><span style="color: rgba(128, 0, 0, 1)">.//*[@id='com_userbar']/ul/li/div/a</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">));
register.Click();

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">显示所有标识</span>
IList&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>&gt; listHand = <span style="background-color: rgba(255, 255, 0, 1)">driver.WindowHandles</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">拿到所有标识</span>
<span style="color: rgba(0, 0, 255, 1)">foreach</span> (<span style="color: rgba(0, 0, 255, 1)">string</span> item <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> listHand)
{
    Console.WriteLine(item);
}

</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">这里一会插入代码</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">

Console.ReadKey();
driver.Quit();</span></pre>
</div>
<p>效果如下:</p>
<p><img src="https://img2020.cnblogs.com/blog/24244/202006/24244-20200611151616122-1278381071.png" alt="image" width="640" height="306" title="image" border="0" style="border: 0 currentColor; display: inline; background-image: none; border-image: none"></p>
<p>下面切换到新打开的窗口后,输入一个12345来表示我们成功了 <br> 在上面的代码基础下 添加下面代码</p>
<div class="cnblogs_code" style="padding: 5px; border: 1px solid rgba(204, 204, 204, 1); background-color: rgba(245, 245, 245, 1); border-image: none">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">切换到注册窗口再输入12345</span>
driver.SwitchTo().<span style="background-color: rgba(255, 255, 0, 1)">Window(listHand[<span style="color: rgba(128, 0, 128, 1)">1</span></span><span style="color: rgba(0, 0, 0, 1)"><span style="background-color: rgba(255, 255, 0, 1)">]);</span>
driver.FindElement(By.Name(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">userName</span><span style="color: rgba(128, 0, 0, 1)">"</span>)).SendKeys(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">12345</span><span style="color: rgba(128, 0, 0, 1)">"</span>);</pre>
</div>
<p>结果如图:</p>
<p><img src="https://img2020.cnblogs.com/blog/24244/202006/24244-20200611105747012-435619532.png" alt="image" width="606" height="345" title="image" border="0" style="margin: 0; border: 0 currentColor; display: inline; background-image: none; border-image: none"></p>
<h3><strong>1、关闭多个子Browser窗口</strong></h3>
<div class="cnblogs_code" style="padding: 5px; border: 1px solid rgba(204, 204, 204, 1); background-color: rgba(245, 245, 245, 1); border-image: none">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取所有的WindowHandle,关闭所有子窗口</span>
<span style="color: rgba(0, 0, 255, 1)">string</span> oldwin =<span style="color: rgba(0, 0, 0, 1)"> driver.CurrentWindowHandle;
ReadOnlyCollection</span>&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>&gt; windows =<span style="color: rgba(0, 0, 0, 1)"> driver.WindowHandles;
</span><span style="color: rgba(0, 0, 255, 1)">foreach</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> win <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> windows)
{
    </span><span style="color: rgba(0, 0, 255, 1)">if</span> (win !=<span style="color: rgba(0, 0, 0, 1)"> oldwin)
    {
      driver.<span style="background-color: rgba(255, 255, 0, 1)">SwitchTo().Window(win).Close();</span>
    }
}
driver.SwitchTo().Window(oldwin);</span></pre>
</div>
<h3><strong>2、对iframe中元素的定位</strong></h3>
<p>1、切换焦点到id为固定值的iframe上</p>
<p>进入页面后,光标默认焦点在DefaultContent中,若想要定位到iframe 需要转换焦点</p>
<div class="cnblogs_code" style="padding: 5px; border: 1px solid rgba(204, 204, 204, 1); background-color: rgba(245, 245, 245, 1); border-image: none">
<pre><span style="color: rgba(0, 0, 0, 1)">driver.SwitchTo().DefaultContent();
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">切换焦点到mainFrame</span>
driver.SwitchTo().Frame(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">mainFrame</span><span style="color: rgba(128, 0, 0, 1)">"</span>);</pre>
</div>
<p>需要注意的是:切换焦点之后若想切换焦点到其他iframe上 需要先返回到defaultcontent,再切换焦点到指定的iframe上。</p>
<p>2、切换焦点到id值为动态值的iframe上</p>
<p>有时候 页面上浮出层的id为动态值,此时需要先获取所有符合记录的iframe放置在数组中,然后遍历数组切换焦点到目标iframe上。</p>
<p>如下方法:</p>
<div class="cnblogs_code" style="padding: 5px; border: 1px solid rgba(204, 204, 204, 1); background-color: rgba(245, 245, 245, 1); border-image: none">
<pre><span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(0, 0, 255, 1)">string</span> bizFrameId = <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.Empty;
</span><span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(0, 0, 255, 1)">string</span> bizId = <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.Empty;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取动态iframe的id值</span>
<span style="color: rgba(0, 0, 255, 1)">protected</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> SetIframeId()
{
    ReadOnlyCollection</span> els = driver.FindElements(By.TagName(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">iframe</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">));
    </span><span style="color: rgba(0, 0, 255, 1)">foreach</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> e <span style="color: rgba(0, 0, 255, 1)">in</span> driver.FindElements(By.TagName(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">iframe</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)))
    {
      </span><span style="color: rgba(0, 0, 255, 1)">string</span> s1 = e.GetAttribute(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">id</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> (s1.IndexOf(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">window</span><span style="color: rgba(128, 0, 0, 1)">"</span>) &gt;= <span style="color: rgba(128, 0, 128, 1)">0</span> &amp;&amp; s1.IndexOf(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">content</span><span style="color: rgba(128, 0, 0, 1)">"</span>) &gt;= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
      {
            bizFrameId </span>= e.GetAttribute(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">id</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">string</span>[] ss = s1.Split(<span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">char</span>[] { <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">_</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> });
            bizId </span>= ss[<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">];
      }
    }
}</span></pre>
</div>
<h2>七、Cookies</h2>
<p>在C#中,通过Cookies属性来获取当前的Cookie集合,然后进行增删改查操作。</p>
<p>Cookie由5个部分组成:名称、值、所在域、路径和过期时间。</p>
<p>下面我们进入百度首页,然后获取cookie,并让它变动一下来看到效果。 代码如下:</p>
<div class="cnblogs_code" style="padding: 5px; border: 1px solid rgba(204, 204, 204, 1); background-color: rgba(245, 245, 245, 1); border-image: none">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> service = EdgeDriverService.CreateDefaultService(<span style="color: rgba(128, 0, 0, 1)">@"</span><span style="color: rgba(128, 0, 0, 1)">.</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">msedgedriver.exe</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
IWebDriver driver </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> OpenQA.Selenium.Edge.EdgeDriver(service);

driver.Navigate().GoToUrl(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http://www.baidu.com</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);


</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取Cookie</span>
ICookieJar listCookie =<span style="color: rgba(0, 0, 0, 1)"> <span style="background-color: rgba(255, 255, 0, 1)">driver.Manage().Cookies;</span>
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> IList listCookie = driver.Manage( ).Cookies.AllCookies;</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">只是显示 可以用Ilist对象
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">显示初始Cookie的内容</span>
Console.WriteLine(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">--------------------</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
Console.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">当前Cookie集合的数量:\t{listCookie.AllCookies.Count}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> i = <span style="color: rgba(128, 0, 128, 1)">0</span>; i &lt; listCookie.AllCookies.Count; i++<span style="color: rgba(0, 0, 0, 1)">)
{

    Console.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Cookie的名称:{listCookie.AllCookies.Name}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
    Console.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Cookie的值:{listCookie.AllCookies.Value}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
    Console.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Cookie的所在域:{listCookie.AllCookies.Domain}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
    Console.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Cookie的路径:{listCookie.AllCookies.Path}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
    Console.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Cookie的过期时间:{listCookie.AllCookies.Expiry}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
    Console.WriteLine(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-----</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
}


</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">添加一个新的Cookie</span>
Cookie newCookie = <span style="color: rgba(0, 0, 255, 1)">new</span> Cookie(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">新Cookie</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">新值</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">""</span>, DateTime.Now.AddDays(<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">));

listCookie.AddCookie(newCookie);
Console.WriteLine(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">--------------------</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
Console.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">当前Cookie集合的数量:\t{listCookie.AllCookies.Count}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> i = <span style="color: rgba(128, 0, 128, 1)">0</span>; i &lt; listCookie.AllCookies.Count; i++<span style="color: rgba(0, 0, 0, 1)">)
{

    Console.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Cookie的名称:{listCookie.AllCookies.Name}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
    Console.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Cookie的值:{listCookie.AllCookies.Value}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
    Console.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Cookie的所在域:{listCookie.AllCookies.Domain}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
    Console.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Cookie的路径:{listCookie.AllCookies.Path}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
    Console.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Cookie的过期时间:{listCookie.AllCookies.Expiry}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
    Console.WriteLine(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-----</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
}

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">删除这个Cookie并再次显示总数</span>
<span style="color: rgba(0, 0, 0, 1)">listCookie.DeleteCookieNamed(newCookie.Name);

Console.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">当前Cookie集合的数量:\t{listCookie.AllCookies.Count}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);


Console.ReadLine();
driver.Quit();</span></pre>
</div>
<p>运行效果如下:</p>
<p><img src="https://img2020.cnblogs.com/blog/24244/202006/24244-20200611105747735-1119097582.png" alt="image" width="343" height="261" title="image" border="0" style="margin: 0; border: 0 currentColor; display: inline; background-image: none; border-image: none"></p>
<h2>八、Window窗口控制</h2>
<p>这个属性是可以对当前的窗口进行简单的控制。如获取坐标和大小,还可以将其最大化。下面我们用过示例代码来试试效果。 <br> 下面的代码是先打开网页,打印坐标和大小,再控制它最大化,再次打印坐标和大小。</p>
<div class="cnblogs_code" style="padding: 5px; border: 1px solid rgba(204, 204, 204, 1); background-color: rgba(245, 245, 245, 1); border-image: none">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> service = EdgeDriverService.CreateDefaultService(<span style="color: rgba(128, 0, 0, 1)">@"</span><span style="color: rgba(128, 0, 0, 1)">.</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">msedgedriver.exe</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
IWebDriver driver </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> OpenQA.Selenium.Edge.EdgeDriver(service);

driver.Navigate().GoToUrl(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http://www.baidu.com</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">打印现在的坐标和大小</span>
IWindow window =<span style="color: rgba(0, 0, 0, 1)"><span style="background-color: rgba(255, 255, 0, 1)"> driver.Manage().Window;</span>
Console.WriteLine(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">第一次打印</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
Console.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">坐标X为{window.Position.X}\tY为{window.Position.Y}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
Console.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">大小长为{window.Size.Width}\t宽为{window.Size.Height}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
Console.WriteLine(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-------------</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">控制最大化</span>
<span style="color: rgba(0, 0, 0, 1)">window<span style="background-color: rgba(255, 255, 0, 1)">.Maximize();</span>

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">再次打印数据</span>
Console.WriteLine(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">第二次打印</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
Console.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">坐标X为{window.Position.X}\tY为{window.Position.Y}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
Console.WriteLine($</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">大小长为{window.Size.Width}\t宽为{window.Size.Height}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
Console.WriteLine(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-------------</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);

Console.ReadLine();
driver.Quit();</span></pre>
</div>
<p>效果如下:</p>
<p><img src="https://img2020.cnblogs.com/blog/24244/202006/24244-20200611105748368-1879569953.png" alt="image" width="334" height="159" title="image" border="0" style="margin: 0; border: 0 currentColor; display: inline; background-image: none; border-image: none"> <br>这里有两个奇怪的地方:

<br>1.我的屏幕是1080P的,输出后的数据中,长只有1936.如果减去16的话到正好是1920.但是宽应该是1080,如果任务栏的宽度是24的话,到也能说得过去。只是数据和我们要的有点偏差,这里需要注意一下。

<br>2.window属性居然只有位置、大小和最大化方法。居然没有最小化或还原(退出最大化状态)方法。</p>
<h2>九、事件</h2>
<p>首先是准备好要添加的事件,然后再挂接。这里可以使用C#的语法糖。在+=后面直接按两次tab键,然后再移动到事件区编辑。</p>
<div class="cnblogs_code" style="padding: 5px; border: 1px solid rgba(204, 204, 204, 1); background-color: rgba(245, 245, 245, 1); border-image: none">
<pre>eventDriver.Navigating += EventDriver_Navigating;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">导航前</span>
eventDriver.Navigated += EventDriver_Navigated;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">导航后</span>
eventDriver.FindingElement += EventDriver_FindingElement;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">查找元素前</span>
eventDriver.FindElementCompleted += EventDriver_FindElementCompleted;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">查找元素后</span>
eventDriver.ElementClicking += EventDriver_ElementClicking;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">元素单击前</span>
eventDriver.<span style="background-color: rgba(255, 255, 0, 1)">ElementClicked += EventDriver_ElementClicked;</span><span style="color: rgba(0, 128, 0, 1)"><span style="background-color: rgba(255, 255, 0, 1)">/</span>/</span><span style="color: rgba(0, 128, 0, 1)">元素单击后</span>
eventDriver.ElementValueChanging += EventDriver_ElementValueChanging;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">元素值改变前</span>
eventDriver.ElementValueChanged += EventDriver_ElementValueChanged;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">元素值改变后</span>
eventDriver.ExceptionThrown += EventDriver_ExceptionThrown;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">异常发生后事件</span></pre>
</div>
<p>挂接事件:</p>
<div class="cnblogs_code" style="padding: 5px; border: 1px solid rgba(204, 204, 204, 1); background-color: rgba(245, 245, 245, 1); border-image: none">
<pre><span style="color: rgba(0, 0, 255, 1)">#region</span> 事件区

<span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 导航前发生的事件
</span><span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span> EventDriver_Navigating(<span style="color: rgba(0, 0, 255, 1)">object</span><span style="color: rgba(0, 0, 0, 1)"> sender, WebDriverNavigationEventArgs e)
{
    </span><span style="color: rgba(0, 0, 255, 1)">this</span>.listMeassage.Add(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-----------------------------------------</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">this</span>.listMeassage.Add($<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">即将要跳转到的URL为:{e.Driver.Url}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
}

</span><span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 导航后发生的事件
</span><span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span> EventDriver_Navigated(<span style="color: rgba(0, 0, 255, 1)">object</span><span style="color: rgba(0, 0, 0, 1)"> sender, WebDriverNavigationEventArgs e)
{
    </span><span style="color: rgba(0, 0, 255, 1)">this</span>.listMeassage.Add(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-----------------------------------------</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">this</span>.listMeassage.Add($<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">跳转到的URL为:{e.Driver.Url}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
}

</span><span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 查找元素前发生
</span><span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span> EventDriver_FindingElement(<span style="color: rgba(0, 0, 255, 1)">object</span><span style="color: rgba(0, 0, 0, 1)"> sender, FindElementEventArgs e)
{
    </span><span style="color: rgba(0, 0, 255, 1)">this</span>.listMeassage.Add(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-----------------------------------------</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);

    </span><span style="color: rgba(0, 0, 255, 1)">this</span>.listMeassage.Add($<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">即将查找的元素为:{e.FindMethod.ToString()}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
}

</span><span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 查找元素后发生
</span><span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span> EventDriver_FindElementCompleted(<span style="color: rgba(0, 0, 255, 1)">object</span><span style="color: rgba(0, 0, 0, 1)"> sender, FindElementEventArgs e)
{
    </span><span style="color: rgba(0, 0, 255, 1)">this</span>.listMeassage.Add(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-----------------------------------------</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">this</span>.listMeassage.Add($<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">找到元素,条件为:{e.FindMethod.ToString()}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
}

</span><span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 单击元素前发生
</span><span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span> EventDriver_ElementClicking(<span style="color: rgba(0, 0, 255, 1)">object</span><span style="color: rgba(0, 0, 0, 1)"> sender, WebElementEventArgs e)
{
    </span><span style="color: rgba(0, 0, 255, 1)">this</span>.listMeassage.Add(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-----------------------------------------</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">this</span>.listMeassage.Add($<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">要单击的元素的value属性为:{e.Element.GetAttribute(</span><span style="color: rgba(128, 0, 0, 1)">"</span>value<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">)}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
}

</span><span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 单击元素后发生
</span><span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span> EventDriver_ElementClicked(<span style="color: rgba(0, 0, 255, 1)">object</span><span style="color: rgba(0, 0, 0, 1)"> sender, WebElementEventArgs e)
{
    System.Threading.Thread.Sleep(</span><span style="color: rgba(128, 0, 128, 1)">3</span> * <span style="color: rgba(128, 0, 128, 1)">1000</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">暂停3秒</span>
    <span style="color: rgba(0, 0, 255, 1)">this</span>.listMeassage.Add(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-----------------------------------------</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">this</span>.listMeassage.Add($<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">单击元素后,现在的URL为:{e.Driver.Url}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
}

</span><span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 单击元素前发生
</span><span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span> EventDriver_ElementValueChanging(<span style="color: rgba(0, 0, 255, 1)">object</span><span style="color: rgba(0, 0, 0, 1)"> sender, WebElementEventArgs e)
{
    </span><span style="color: rgba(0, 0, 255, 1)">this</span>.listMeassage.Add(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-----------------------------------------</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">this</span>.listMeassage.Add($<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">元素更改前的值为:{e.Element.GetAttribute(</span><span style="color: rgba(128, 0, 0, 1)">"</span>value<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">)}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
}

</span><span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 单击元素后发生
</span><span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span> EventDriver_ElementValueChanged(<span style="color: rgba(0, 0, 255, 1)">object</span><span style="color: rgba(0, 0, 0, 1)"> sender, WebElementEventArgs e)
{
    </span><span style="color: rgba(0, 0, 255, 1)">this</span>.listMeassage.Add(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-----------------------------------------</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">this</span>.listMeassage.Add($<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">元素更改后的值为:{e.Element.GetAttribute(</span><span style="color: rgba(128, 0, 0, 1)">"</span>value<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">)}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
}

</span><span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 异常(保存截图到本地)
</span><span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(128, 128, 128, 1)">///</span>
<span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span> EventDriver_ExceptionThrown(<span style="color: rgba(0, 0, 255, 1)">object</span><span style="color: rgba(0, 0, 0, 1)"> sender, WebDriverExceptionEventArgs e)
{
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">地址</span>
    <span style="color: rgba(0, 0, 255, 1)">string</span> strPath = $<span style="color: rgba(128, 0, 0, 1)">@"</span><span style="color: rgba(128, 0, 0, 1)">D:\Desktop\{DateTime.Now.ToString(</span><span style="color: rgba(128, 0, 0, 1)">"</span>yyyy-MM-dd HH-mm-ss<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">)}.png</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">保存截图</span>
    Screenshot screen = (sender <span style="color: rgba(0, 0, 255, 1)">as</span><span style="color: rgba(0, 0, 0, 1)"> EventFiringWebDriver).GetScreenshot();
    screen.SaveAsFile(strPath, System.Drawing.Imaging.ImageFormat.Png);

    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">输出保存信息</span>
    <span style="color: rgba(0, 0, 255, 1)">this</span>.listMeassage.Add(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-----------------------------------------</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 0, 255, 1)">this</span>.listMeassage.Add($<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">发生异常,截图已保存到:{strPath}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
}</span></pre>
</div>
<h2>十、关闭浏览器</h2>
<p>有下面两种:</p>
<ol>
<li><strong>Close</strong>():关闭WedDriver对象所在的窗口; <br>第一个是关闭一个窗口,一个wedDriver对象是可以有多个窗口的(之前的窗口切换也是提到过),需要关闭时要保证当前激活的窗口。比如一个wedDriver对象里有好多个窗口,你要关闭第2个窗口,就要用SwitchTo().Window()方法切换到第2个窗口才能关闭,不能直接关闭第几个窗口的。</li>
<li><strong>Quit</strong>():关闭所有相关窗口;

    <br>第二个关闭和这个webDriver对象所有相关的窗口。当然,一个脚本是可以有多个webDriver对象</li>

</ol>
<p>下面代码的代码展示这了两个方法的用法和用途。
<br>1.打开百度首页,单击“注册”超级链接。

<br>2.在弹出的窗口(百度账户注册)中,调用Close()方法,关闭新弹出的页面

<br>3.再一次点击“注册”超级链接,调用Quit()方法来结束测试。</p>
<div class="cnblogs_code" style="padding: 5px; border: 1px solid rgba(204, 204, 204, 1); background-color: rgba(245, 245, 245, 1); border-image: none">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> service = EdgeDriverService.CreateDefaultService(<span style="color: rgba(128, 0, 0, 1)">@"</span><span style="color: rgba(128, 0, 0, 1)">.</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">msedgedriver.exe</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
IWebDriver driver </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> OpenQA.Selenium.Edge.EdgeDriver(service);

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">导航到百度首页</span>
driver.Navigate().GoToUrl(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http://www.baidu.com</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">进行点击</span>
Console.WriteLine(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-------------------</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
Console.WriteLine(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">进行点击</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
driver.FindElement(By.LinkText(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">登录</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)).Click();
System.Threading.Thread.Sleep(</span><span style="color: rgba(128, 0, 128, 1)">3</span> * <span style="color: rgba(128, 0, 128, 1)">1000</span><span style="color: rgba(0, 0, 0, 1)">);
driver.FindElement(By.LinkText(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">立即注册</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)).Click();

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取窗口句柄</span>
IList&lt;<span style="color: rgba(0, 0, 255, 1)">string</span>&gt; listHand =<span style="color: rgba(0, 0, 0, 1)"> driver.WindowHandles;

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">切换到注册窗口并关闭</span>
Console.WriteLine(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-------------------</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
Console.WriteLine(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">切换到注册窗口</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
driver.SwitchTo().Window(listHand[</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">]);
System.Threading.Thread.Sleep(</span><span style="color: rgba(128, 0, 128, 1)">3</span> * <span style="color: rgba(128, 0, 128, 1)">1000</span><span style="color: rgba(0, 0, 0, 1)">);
Console.WriteLine(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-------------------</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
Console.WriteLine(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">关闭注册窗口</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
<span style="background-color: rgba(255, 255, 0, 1)">driver.Close();</span>
System.Threading.Thread.Sleep(</span><span style="color: rgba(128, 0, 128, 1)">3</span> * <span style="color: rgba(128, 0, 128, 1)">1000</span><span style="color: rgba(0, 0, 0, 1)">);

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">切换到主窗口并结束测试</span>
Console.WriteLine(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-------------------</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
Console.WriteLine(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">切换到主窗口并结束测试</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
driver.SwitchTo().Window(listHand[</span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">]);
driver.FindElement(By.LinkText(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">立即注册</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)).Click();
System.Threading.Thread.Sleep(</span><span style="color: rgba(128, 0, 128, 1)">3</span> * <span style="color: rgba(128, 0, 128, 1)">1000</span><span style="color: rgba(0, 0, 0, 1)">);
<span style="background-color: rgba(255, 255, 0, 1)">driver.Quit();</span>

Console.ReadLine();</span></pre>
</div><br><br>
来源:https://www.cnblogs.com/springsnow/p/13088186.html
頁: [1]
查看完整版本: C#爬虫(03):使用Selenium