zoukankan      html  css  js  c++  java
  • C# selenium 实例-批量下载word文章

    感悟:

    1、用chrome好处之一就是:可以直接从开发工具中复制XPath,然后用在C#字符串前加上@,并将字符串当中每一个双引号都换成两个双引号即可,比较方便。

    2、用selenium的好处就是在frame间切换比较方便。

    场景:

    我用的OA就是frame套iframe,感觉稍微难点就是frame切换,但是找到button点击就可以下载word了。

    费了半天劲,虽然代码比较粗糙,但是终于可以从OA一次下载10篇文章了。

    代码:

            private void 批量处理待办ToolStripMenuItem_Click(object sender, EventArgs e)
            {
                var driver = new OpenQA.Selenium.Chrome.ChromeDriver();
                driver.Navigate().GoToUrl("http://192.168.132.80/login/Login.jsp");
                driver.FindElement(By.Id("loginid")).SendKeys("admin");
                driver.FindElement(By.Id("userpassword")).SendKeys("1234");
                driver.FindElement(By.Id("login")).Click();
                WebDriverWait explicitWait = new WebDriverWait(driver, TimeSpan.FromSeconds(6));
                explicitWait.Until(d => d.FindElement(By.Id("mainFrame")));
                driver.SwitchTo().Frame("mainFrame");
                driver.FindElement(By.Id("more_655")).Click();//more_1560 ////*[@id="more_655"]
                driver.SwitchTo().Window(driver.WindowHandles[1]);
                System.Threading.Thread.Sleep(2000);
                ReadOnlyCollection<IWebElement> eles = driver.FindElements(By.XPath("//a[starts-with(@href,'javaScript:openFullWindowHaveBarForWFList')]"));
                //这里无需循环,点第一个即可,后续操作会自动刷新窗口
                eles[0].Click();
                System.Threading.Thread.Sleep(2000);
                driver.SwitchTo().Window(driver.WindowHandles[2]);
                //frame1:  还有bodyiframe
                driver.SwitchTo().Frame("bodyiframe");
                System.Threading.Thread.Sleep(2000);
                //frame2 页面中的编辑控件中,还有iframe  //*[@id="cke_contents_remark"]/iframe
                IWebElement frameED = driver.FindElement(By.XPath(@"//*[@id=""cke_contents_remark""]/iframe"));
                driver.SwitchTo().Frame(frameED);
                ///html
                driver.FindElement(By.XPath(@"/html")).SendKeys("同意");
                driver.SwitchTo().ParentFrame().SwitchTo().DefaultContent();
                driver.FindElement(By.XPath(@"//*[@id=""toolbarmenu""]/td[1]/table/tbody/tr[2]/td[2]/em/button")).Click();////*[@id="toolbarmenu"]/td[1]/table/tbody/tr[2]/td[2]/em/button
                System.Threading.Thread.Sleep(10000);
                driver.Quit();//在完成操作后,同时关闭浏览器窗口和Weddriver会话
    
            }
    
            private void 批量下载已阅新闻ToolStripMenuItem_Click(object sender, EventArgs e)
            {
                var driver = new OpenQA.Selenium.Chrome.ChromeDriver();
                driver.Navigate().GoToUrl("http://192.168.132.80/login/Login.jsp");
                driver.FindElement(By.Id("loginid")).SendKeys("admin");
                driver.FindElement(By.Id("userpassword")).SendKeys("1234");
                driver.FindElement(By.Id("login")).Click();
                System.Threading.Thread.Sleep(1000);
                //*[@id="_ButtonCancel_0"]
                try
                {
                    driver.FindElement(By.XPath(@"//*[@id=""_ButtonCancel_0""]")).Click();
                }
                catch { }
                //主页 流程 
                driver.FindElement(By.XPath(@"//*[@id=""head""]/tbody/tr/td[2]/table/tbody/tr/td/div/div[1]/div[4]")).Click();
                System.Threading.Thread.Sleep(3000);
                //左侧已办 //*[@id="drillmenu"]/ul/li[3]/a
                driver.FindElement(By.XPath(@"//*[@id=""drillmenu""]/ul/li[3]")).Click();
                //进入frame1  mainFrame  /html/body/table/tbody/tr[2]/td[2]/table/tbody/tr[1]/td/table/tbody/tr[2]/td[1]/table/tbody/tr/td/div[3]/ul/li[7]
                driver.SwitchTo().Frame("mainFrame");
                System.Threading.Thread.Sleep(3000);
                ReadOnlyCollection<IWebElement> anchors = driver.FindElements(By.XPath(@"//a"));
                foreach (IWebElement a in anchors)
                {
                    if (a.Text.Contains("XX审批流程()"))
                    {
                        a.Click();
                        break;
                    }
                }
                //循环开始
                for (int k = 0; k < 11; k++)
                {
                    ////*[@id="_xTable"]/div[1]/div[2]/table/tbody/tr[1]/td[6]/a
                    ReadOnlyCollection<IWebElement> oo = driver.FindElements(By.XPath("//a[contains(@href,'javaScript:openFullWindowHaveBarForWFList')]"));
                    int count = oo.Count;
                    for (int i = 0; i < count ; i++)
                    {    
                        //开新窗口1
                        oo[i].Click();
                        System.Threading.Thread.Sleep(1000);
                        int j = i + 1;
                        //切换到新窗口
                        driver.SwitchTo().Window(driver.WindowHandles[1]);
                        System.Threading.Thread.Sleep(2000);
                        //还有bodyiframe
                        driver.SwitchTo().Frame("bodyiframe");
                        //下载按钮 //*[@id="selectDownload"]/nobr/button
                        // driver.FindElement(By.XPath(@"//button[@class=""btnFlowd""]")).Click();
                        driver.FindElement(By.TagName(@"button")).Click();
                        System.Threading.Thread.Sleep(5000);
                        //关闭下载页,即当前窗口
                        driver.Close();
                        //循环后要切回窗口0     因为关闭窗口1后,也没有自动回到窗口0的mainFrame中!且oo也无法循环了
                        driver.SwitchTo().Window(driver.WindowHandles[0]);
                        driver.SwitchTo().Frame("mainFrame");
                        oo = driver.FindElements(By.XPath("//a[contains(@href,'javaScript:openFullWindowHaveBarForWFList')]"));
                    }
                    //循环后切回窗口0,点下一页,
                    System.Threading.Thread.Sleep(8000);
                    driver.SwitchTo().Window(driver.WindowHandles[0]);
                    System.Threading.Thread.Sleep(2000);
                    driver.SwitchTo().Frame("mainFrame");
                    driver.FindElement(By.Id(@"-weaverTable-0-next")).Click();//*[@id="-weaverTable-0-next"]
                    System.Threading.Thread.Sleep(2000);
                }
                //循环结束            
                driver.Quit();//在完成操作后,同时关闭浏览器窗口和Weddriver会话
            }
  • 相关阅读:
    十四、数据库公共字段处理
    十、前端tag、自定义tag、filter和simple_tag
    kafka生产、消费py脚本
    django模板filter及自定义filter
    django基础,前后端分离数据传参
    django基础——使用django form校验数据
    django自带的后台管理框架django-admin
    django基础——前后端分离,页面分页
    django基础——数据库的增删改查
    django基础——models数据库操作
  • 原文地址:https://www.cnblogs.com/pu369/p/12390920.html
Copyright © 2011-2022 走看看