using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Data; using System.Diagnostics; using System.Dynamic; using System.IO; using System.Linq; using System.Threading; using NPOI.HPSF; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using OpenQA.Selenium.Interactions; using OpenQA.Selenium.Support.Extensions; using OpenQA.Selenium.Support.UI; namespace wispro.sp.utility { public class IPEasyUtility { static string strFileSavePath = ConfigHelper.GetSectionValue("IPEasySetting:DownloadFileSavePath"); static string Account = ConfigHelper.GetSectionValue("IPEasySetting:Account"); static string Password = ConfigHelper.GetSectionValue("IPEasySetting:Password"); static bool WaitForFileDownload(string downloadDir, string fileName, TimeSpan timeout) { DateTime startTime = DateTime.Now; while (DateTime.Now - startTime < timeout) { string filePath = Path.Combine(downloadDir, fileName); if (File.Exists(filePath)) { // 检查文件是否完成写入(文件大小是否稳定) long previousSize = 0; long currentSize = new FileInfo(filePath).Length; while (previousSize != currentSize) { Thread.Sleep(1000); // 等待一段时间 previousSize = currentSize; currentSize = new FileInfo(filePath).Length; } return true; // 文件下载完成 } Thread.Sleep(1000); // 等待文件出现 } return false; // 超时,文件未下载完成 } static IWebElement waitGetElementById(WebDriverWait wait,string id,IWebElement parentElement =null) { return wait.Until((d) => { try { if (parentElement == null) { return d.FindElement(By.Id(id)); } else { return parentElement.FindElement(By.Id(id)); } } catch { return null; } }); } static IWebElement waitGetElementByName(WebDriverWait wait, string name, IWebElement parentElement = null) { return wait.Until((d) => { try { if (parentElement == null) { return d.FindElement(By.Name(name)); } else { return parentElement.FindElement(By.Name(name)); } } catch { return null; } }); } static IWebElement waitGetElementByTagName(WebDriverWait wait, string name, IWebElement parentElement = null) { return wait.Until((d) => { try { if (parentElement == null) { return d.FindElement(By.TagName(name)); } else { return parentElement.FindElement(By.TagName(name)); } } catch { return null; } }); } static ReadOnlyCollection waitGetElementsByName(WebDriverWait wait, string name, IWebElement parentElement = null) { return wait.Until((d) => { try { if (parentElement == null) { return d.FindElements(By.Name(name)); } else { return parentElement.FindElements(By.Name(name)); } } catch { return null; } }); } static ReadOnlyCollection waitGetElementsByTagName(WebDriverWait wait, string name, IWebElement parentElement = null) { return wait.Until((d) => { try { if (parentElement == null) { return d.FindElements(By.TagName(name)); } else { return parentElement.FindElements(By.TagName(name)); } } catch { return null; } }); } static IWebElement waitGetElementByClassName(WebDriverWait wait, string name, IWebElement parentElement = null) { return wait.Until((d) => { try { if (parentElement == null) { return d.FindElement(By.ClassName(name)); } else { return parentElement.FindElement(By.ClassName(name)); } } catch { return null; } }); } /// /// 获取指定案号的专利申请案的基本信息和初稿文件、定稿文件和第一次返稿文件 /// /// /// /// public static dynamic DownloadCaseFiles(string caseNo) { dynamic retObject = new ExpandoObject(); retObject.CaseNo = caseNo.Trim(); using (IWebDriver driver = CreateChromeDriver()) { try { WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(50)); Login(driver, wait); //点击顶部菜单栏中的案件管理菜单 IWebElement linkCaseManager = waitGetElementByName(wait, "71A7CC35-F597-40E1-9FEF-BE622A3A3B63"); linkCaseManager.Click(); IWebElement linkCaseSearch = wait.Until((d) => { try { return driver.FindElement(By.LinkText("案件查询")); } catch { return null; } }); driver.ExecuteJavaScript("arguments[0].click();", linkCaseSearch); //linkCaseSearch.Click(); IWebElement patentSearch = waitGetElementByName(wait, "4df7eee3-426f-4ce5-9204-34ccb0fd27f7"); driver.ExecuteJavaScript("arguments[0].click();", patentSearch); //patentSearch.Click(); driver.SwitchTo().Frame(1); var inputSearch = waitGetElementById(wait, "case_volume");//driver.FindElement(By.Id("case_volume")); inputSearch.SendKeys(caseNo.Trim()); var btnSearch = waitGetElementById(wait, "btn_Search");// driver.FindElement(By.Id("btn_Search")); btnSearch.Click(); try { var caseLink = wait.Until((d) => { return d.FindElement(By.XPath($"//a[contains(text(),'{caseNo}')]")); }); caseLink.Click(); } catch(Exception ex) { if(ex.Message.Contains("no such element: Unable to locate element")) { return retObject; } } System.Threading.Thread.Sleep(1000); driver.SwitchTo().ParentFrame(); driver.SwitchTo().Frame(2); //案件名称 retObject.CaseName = waitGetElementById(wait, "p_case_info__case_name").GetAttribute("value"); //我方文号 retObject.CaseNo = waitGetElementById(wait, "p_case_info__case_volume").GetAttribute("value"); //案件类型 retObject.CaseType = waitGetElementById(wait, "p_case_info__case_type_id").GetAttribute("value"); //申请类型 var selectElement = waitGetElementById(wait, "p_case_info__apply_type_id"); retObject.ApplicationType = new SelectElement(selectElement).SelectedOption.Text; //客户 retObject.Customer = waitGetElementById(wait, "p_case_info__customer_id").GetAttribute("value").Replace("(null)", ""); //申请国家 retObject.Country = waitGetElementById(wait, "p_case_info__country_id").GetAttribute("value"); var table = waitGetElementById(wait, "table_ProcList"); var rows = waitGetElementsByTagName(wait, "tr", table);// table.FindElements(By.TagName("tr")); foreach (var row in rows) { var cells = row.FindElements(By.TagName("td")); if (cells[1].Text == "新申请") { var bthEdit = waitGetElementByClassName(wait, "tbedit", cells[12]); driver.ExecuteJavaScript("arguments[0].click();", bthEdit); break; } } driver.SwitchTo().ParentFrame().SwitchTo().Frame(0); //案件阶段 var caseStage = waitGetElementById(wait, "select2-p_proc_info__review_stage-container"); if (caseStage != null && caseStage.Text != "--请选择--") { retObject.CaseStage = caseStage.Text; } //内部期限 retObject.InternalDate = waitGetElementById(wait, "p_proc_info__int_due_date").GetAttribute("value"); //处理事项系数 var DICoe = waitGetElementById(wait, "p_proc_info__proc_coefficient_id"); retObject.DoItemCoefficient = new SelectElement(DICoe).SelectedOption.Text; if (retObject.DoItemCoefficient == "请选择") { retObject.DoItemCoefficient = ""; } retObject.DoPersons = waitGetElementById(wait, "pic_list").GetAttribute("value"); //处理人 retObject.Reviewer = waitGetElementById(wait, "rev_list").GetAttribute("value"); //核稿人 //第一次初稿日 retObject.FirstDraftDate = waitGetElementById(wait, "p_proc_info__first_doc_date").GetAttribute("value"); //客户期限 retObject.CustomerLimitDate = waitGetElementById(wait, "p_proc_info__cus_due_date").GetAttribute("value"); //配案日 retObject.CaseAssigmentDate = waitGetElementById(wait, "p_proc_info__allocate_date").GetAttribute("value"); //返稿日 retObject.ReturnDate = waitGetElementById(wait, "p_proc_info__back_date").GetAttribute("value"); //定稿日 retObject.FinalizationDate = waitGetElementById(wait, "p_proc_info__finish_doc_date").GetAttribute("value"); var lifile = driver.FindElement(By.Id("lifile")); driver.ExecuteJavaScript("arguments[0].click();", lifile); //添加从文件清单中获取“新申请第一次内审 (初稿)、 新申请第一次返稿(第一次发客户文档)、新申请文档(定稿文档)” var table_filelist = waitGetElementById(wait, "table_filelist"); //定稿文件 Download(retObject, driver, wait, table_filelist, "新申请文档"); //新申请第一次返稿文件 Download(retObject, driver, wait, table_filelist, "新申请第一次返稿"); //初稿文件 waitGetElementById(wait, "draftfiletoggle").Click(); var table_draffilelist = waitGetElementById(wait, "table_draftfilelist");// driver.FindElement(By.Id("table_draftfilelist")); Download(retObject, driver, wait, table_draffilelist, "新申请第一次内审"); } catch (Exception ex) { throw new Exception(ex.Message, ex); } finally { driver.Quit(); killChromProcess(); } } return retObject; } private static void Download(dynamic retObject, IWebDriver driver, WebDriverWait wait, IWebElement table_filelist, string fileType) { var finallyFile = wait.Until((d) => { try { return table_filelist.FindElement(By.XPath($"//td[@colname='file_desc'][normalize-space()='{fileType}']")); } catch (Exception ex) { return null; } }); if(finallyFile == null) { switch (fileType) { case "新申请文档": retObject.finallyFile = null; break; case "新申请第一次返稿": retObject.firstReturnFile = null; break; case "新申请第一次内审": retObject.draftFile = null; break; } return; } var tdfileName = wait.Until((d) => { try { return finallyFile.FindElement(By.XPath("preceding-sibling::*[2]")); } catch { return null; } }); string fileName = tdfileName.Text; while (string.IsNullOrEmpty(fileName)) { System.Threading.Thread.Sleep(100); fileName = tdfileName.Text; } string filePath = System.IO.Path.Combine(strFileSavePath, fileName); if (System.IO.File.Exists(filePath)) { System.IO.File.Delete(filePath); } switch (fileType) { case "新申请文档": retObject.finallyFile = filePath; break; case "新申请第一次返稿": retObject.firstReturnFile = filePath; break; case "新申请第一次内审": retObject.draftFile = filePath; break; } var btnDownload = finallyFile.FindElement(By.XPath("following-sibling::*[4]")); btnDownload = waitGetElementByClassName(wait, "tbdownload", btnDownload); driver.ExecuteJavaScript("arguments[0].click();", btnDownload); WaitForFileDownload(strFileSavePath, fileName, TimeSpan.FromMinutes(5)); } private static void Login(IWebDriver driver, WebDriverWait wait) { //进入登录界面 driver.Navigate().GoToUrl(ConfigHelper.GetSectionValue("IPEasySetting:IPEasyWeb")); //输入用户名和密码 waitGetElementById(wait, "txtUser").SendKeys(Account); waitGetElementById(wait, "txtPwd").SendKeys(Password); //点击登录按钮 waitGetElementById(wait, "btnLogin").Click(); //关闭提示遮罩层 waitGetElementById(wait, "jpwClose").Click(); } public static void DownloadReport(string strId,string filename) { using (IWebDriver driver = CreateChromeDriver()) { try { WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(50)); Login(driver, wait); //点击顶部菜单栏中的报表管理菜单 waitGetElementById(wait, "970d33d5-c728-41b8-a060-4330610706b9").Click(); //driver.FindElement(By.Name("970d33d5-c728-41b8-a060-4330610706b9")).Click(); //点击左侧 自定义报表 菜单 waitGetElementByName(wait, "642fa96f-1e1f-46fd-aaa4-cb461ee8df5b").Click(); //driver.FindElement(By.Name("642fa96f-1e1f-46fd-aaa4-cb461ee8df5b")).Click(); //切换到自定义报表Frame driver.SwitchTo().Frame(1); //调用报表导出JS ((IJavaScriptExecutor)driver).ExecuteScript($"Report.Export('{strId}');"); //切换到弹出的导出报表窗口,点击导出按钮 driver.SwitchTo().DefaultContent(); var ihg_export = waitGetElementByName(wait, "ihg_export"); //driver.FindElement(By.Name("ihg_export")); driver.SwitchTo().Frame(ihg_export); waitGetElementById(wait, "btnSubmit").Click(); //driver.FindElement(By.Id("btnSubmit")).Click(); WaitForFileDownload(strFileSavePath, filename, TimeSpan.FromMinutes(5)); } catch (Exception ex) { throw new Exception(ex.Message); } finally { driver.Quit(); driver.Dispose(); killChromProcess(); } } } private static void Log(string strMessage) { StreamWriter sw = File.AppendText("c:\\temp\\log.txt"); sw.WriteLine($"{strMessage}"); sw.Flush(); sw.Close(); sw.Dispose(); } private static OpenQA.Selenium.Chrome.ChromeDriver CreateChromeDriver() { bool isheadless = (ConfigHelper.GetSectionValue("IPEasySetting:isHeadless") == "true"); var options = new OpenQA.Selenium.Chrome.ChromeOptions(); options.AddUserProfilePreference("profile.default_content_settings.popups", 0); options.AddUserProfilePreference("profile.default_content_setting_values.automatic_downloads", 1); options.AddUserProfilePreference("download.prompt_for_download", false); // 禁止下载提示 options.AddUserProfilePreference("download.default_directory", strFileSavePath); options.AddUserProfilePreference("intl.accept_languages", "nl"); options.AddUserProfilePreference("disable-popup-blocking", "true"); options.AddUserProfilePreference("safebrowsing.enabled", true); options.AddArgument($"--unsafely-treat-insecure-origin-as-secure={ConfigHelper.GetSectionValue("IPEasySetting:IPEasyWeb").Replace("/Login.aspx", "")}");//替换自己的域名,多域名可用逗号分隔。 if (isheadless) { options.AddArgument("headless"); } var driver = new OpenQA.Selenium.Chrome.ChromeDriver(ConfigHelper.GetSectionValue("IPEasySetting:ChormeDriverPath"), options); driver.Manage().Window.Maximize(); driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(50); driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(100); return driver; } /// /// 根据报表名称导出报表 /// /// 报告名称 /// 是否手动修改日期范围 public static DataTable DownloadReport(string ReportName,bool isModifyDate) { Log($"{DateTime.Now}\t开始下载:{ReportName}"); DataTable retDatatable; Log($"{DateTime.Now}\t开始启动Chrome"); using (IWebDriver driver = CreateChromeDriver()) { try { WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(20)); Login(driver, wait); //点击顶部菜单栏中的报表管理菜单 Log($"{DateTime.Now}\t点击顶部菜单栏中的报表管理菜单"); var reportMenu = waitGetElementByName(wait, "970d33d5-c728-41b8-a060-4330610706b9"); //driver.FindElement(By.Name("970d33d5-c728-41b8-a060-4330610706b9")); driver.ExecuteJavaScript("arguments[0].click();", reportMenu); //点击左侧 自定义报表 菜单 Log($"{DateTime.Now}\t点击左侧 自定义报表 菜单"); var customerReportMenu = waitGetElementByName(wait, "642fa96f-1e1f-46fd-aaa4-cb461ee8df5b"); driver.ExecuteJavaScript("arguments[0].click();", customerReportMenu); //切换到自定义报表Frame Log($"{DateTime.Now}\t切换到自定义报表Frame"); driver.SwitchTo().Frame(1); Log($"{DateTime.Now}\t开始搜索报告"); var inputSearch = waitGetElementById(wait,"customizedList_TxtSheetSearchKey"); Log($"{DateTime.Now}\t在搜索框中输入报告名称"); inputSearch.SendKeys(ReportName); Log($"{DateTime.Now}\t点击搜索按钮"); var btnSearch = waitGetElementByClassName(wait,"btn-search"); btnSearch.Click(); Log($"{DateTime.Now}\t选中报告"); var reportRecord = wait.Until((d) => { try { return d.FindElement(By.XPath($"//td[contains(text(),'{ReportName}')]")); } catch { return null; } }); reportRecord.Click(); if (isModifyDate) { Log($"{DateTime.Now}\t点击编辑"); var btnEdit = waitGetElementByClassName(wait,"edit"); btnEdit.Click(); Log($"{DateTime.Now}\t清除以选择的处理事项完成日条件"); try { var doItemFinished = wait.Until((d) => { return d.FindElement(By.XPath("//span[contains(@objcvalue,'_date') and contains(@id,'ST;')]")); }); doItemFinished.Click(); } catch { } Log($"{DateTime.Now}\t输入处理事项完成日期:开始日期"); var startDate = wait.Until((d) => { return d.FindElement(By.XPath("//input[contains(@id,'dt_s_')]")); }); startDate.Click(); startDate.SendKeys(new DateTime(DateTime.Now.AddMonths(-1).Year, DateTime.Now.AddMonths(-1).Month, 1).ToString("yyyy-MM-dd")); Log($"{DateTime.Now}\t输入处理事项完成日期:结束日期"); var endDate = wait.Until((d) => { try { return d.FindElement(By.XPath("//input[contains(@id,'dt_e_')]"));//.Id("dt_e_4F8FE88D-9040-45F1-9723-45699BCD4CAF")); } catch { return null; } }); endDate.Click(); endDate.SendKeys(new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddDays(-1).ToString("yyyy-MM-dd")); Log($"{DateTime.Now}\t添加处理事项检索条件"); var addDate = wait.Until((d) => { try { return d.FindElement(By.XPath("//a[contains(@onclick,'ReportSub.ConditionDTSelect')]")); } catch { return null; } }); addDate.Click(); //System.Threading.Thread.Sleep(500); Log($"{DateTime.Now}\t保存检索条件"); var btnSave = waitGetElementById(wait, "save"); // driver.FindElement(By.Id("save")); btnSave.Click(); //System.Threading.Thread.Sleep(3000); } Log($"{DateTime.Now}\t点击导出Excel链接"); var linkExport = wait.Until((d) => { try { return d.FindElement(By.XPath("//a[contains(@onclick,'-') and @class='tbexcel']")); } catch { return null; } }); linkExport.Click(); //切换到弹出的导出报表窗口,点击导出按钮 Log($"{DateTime.Now}\t切换到弹出的导出报表窗口,点击导出按钮"); driver.SwitchTo().DefaultContent(); var ihg_export = driver.FindElement(By.Name("ihg_export")); driver.SwitchTo().Frame(ihg_export); waitGetElementById(wait, "btnSubmit").Click(); //切换到弹出的下载报表界面,点击下载按钮 Log($"{DateTime.Now}\t切换到弹出的下载报表界面,点击下载按钮"); //System.Threading.Thread.Sleep(3000); driver.SwitchTo().DefaultContent(); var frameDownload = waitGetElementByName(wait,"DownloadList"); driver.SwitchTo().Frame(frameDownload); var firstTr = waitGetElementByTagName(wait,"tr"); var tdStatus = firstTr.FindElement(By.XPath("//td")).FindElement(By.XPath("following-sibling::td[4]")); string strStatus = tdStatus.Text; while (strStatus.Trim() != "导出成功!") { if (strStatus.Trim() == "导出失败,请稍后重试!") { return null; } System.Threading.Thread.Sleep(5000); firstTr = waitGetElementByTagName(wait, "tr"); tdStatus = firstTr.FindElement(By.XPath("//td")).FindElement(By.XPath("following-sibling::td[4]")); strStatus = tdStatus.Text; } Log($"{DateTime.Now}\t点击下载按钮下载文档"); firstTr = waitGetElementByTagName(wait, "tr"); firstTr.FindElement(By.XPath("//td/a[@title='下载']")).Click(); //System.Threading.Thread.Sleep(5000); //btnDownload.Click(); string strFilePath = System.IO.Path.Combine(strFileSavePath, $"{ReportName.Trim()}.xlsx"); WaitForFileDownload(strFileSavePath, $"{ReportName.Trim()}.xlsx", TimeSpan.FromMinutes(5)); //删除下载记录 Log($"{DateTime.Now}\t删除下载记录"); firstTr = waitGetElementByTagName(wait, "tr");// driver.FindElement(By.TagName("tr")); firstTr.FindElement(By.XPath("//td/a[@title='删除']")).Click(); //System.IO.FileInfo file = new System.IO.FileInfo(strFilePath.Replace("~", "_")); retDatatable = NPOIExcel.ExcelToDataTable(strFilePath.Replace("~", "_"), true); System.IO.File.Delete(strFilePath.Replace("~", "_")); } catch (Exception ex) { Log(ex.ToString()); throw new Exception(ex.Message, ex); } finally { Log("关闭Chrome"); driver.Quit(); driver.Dispose(); killChromProcess(); } } Log($"{DateTime.Now}\t返回数据"); return retDatatable; } /// /// 获取案件基本信息 /// /// 我方文号 /// public static dynamic GetCaseInfo(string caseNo) { dynamic retObject = new ExpandoObject(); retObject.CaseNo = caseNo.Trim(); using (IWebDriver driver = CreateChromeDriver()) { try { WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(20)); Login(driver, wait); //点击顶部菜单栏中的案件管理菜单 waitGetElementByName(wait, "71A7CC35-F597-40E1-9FEF-BE622A3A3B63").Click(); //点击左侧 查询 菜单 waitGetElementByName(wait, "c3266ab3-521a-4815-8aaf-7dd0bc5a76af").Click(); //切换到自定义报表Frame driver.SwitchTo().Frame(1); var inputSearch = waitGetElementById(wait,"case_volume"); inputSearch.SendKeys(caseNo.Trim()); var btnSearch = waitGetElementById(wait, "btn_Search"); btnSearch.Click(); var caseLink = wait.Until((d) => { return d.FindElement(By.XPath($"//a[contains(text(),'{caseNo}')]")); }); caseLink.Click(); driver.SwitchTo().ParentFrame().SwitchTo().Frame(2); //等待页面上ID属性值为submitButton的元素加载完成 IWebElement myElement = wait.Until((d) => { try { return d.FindElement(By.Id("libase")); } catch { return null; } }); myElement.Click(); //driver.FindElement(By.Id("libase")).Click(); retObject.CaseName = driver.FindElement(By.Id("p_case_info__case_name")).GetAttribute("value"); //案件名称 retObject.CustomerName = driver.FindElement(By.Id("p_case_info__customer_id")).GetAttribute("value"); //客户名称 retObject.BusinessType = driver.FindElement(By.Id("p_case_info__business_type_id")).GetAttribute("value"); //业务类型 retObject.CaseState = GetSelectText(driver.FindElement(By.Id("p_case_info__case_status_id"))); retObject.ApplicationType = GetSelectText(driver.FindElement(By.Id("p_case_info__apply_type_id"))); retObject.CaseType = driver.FindElement(By.Id("p_case_info__case_type_id")).GetAttribute("value"); //案件类型 retObject.EntrustingDate = driver.FindElement(By.Id("p_case_info__charge_date")).GetAttribute("value"); //委案日期 retObject.CaseMemo = driver.FindElement(By.Id("p_case_info__remark")).GetAttribute("value"); //案件备注 driver.FindElement(By.XPath($"//span[contains(text(),'扩展信息')]")).Click(); //select[@id='p_case_info__case_coefficient_id'] retObject.CaseCoefficient = GetSelectText(driver.FindElement(By.Id("p_case_info__case_coefficient_id"))); } catch (Exception ex) { throw new Exception(ex.Message, ex); } finally { driver.Quit(); killChromProcess(); } } return retObject; } public static dynamic GetPerformanceRecord(string caseNo, List doItemNames) { dynamic retObject = new ExpandoObject(); retObject.CaseNo = caseNo.Trim(); using (var Service = ChromeDriverService.CreateDefaultService(ConfigHelper.GetSectionValue("IPEasySetting:ChormeDriverPath"))) { Service.Start(); using (IWebDriver driver = CreateChromeDriver()) { try { WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(20)); Login(driver,wait); //点击顶部菜单栏中的案件管理菜单 waitGetElementByName(wait,"71A7CC35-F597-40E1-9FEF-BE622A3A3B63").Click(); //点击左侧 查询 菜单 waitGetElementByName(wait, "c3266ab3-521a-4815-8aaf-7dd0bc5a76af").Click(); driver.SwitchTo().Frame(1); var inputSearch = wait.Until((d) => { try { //切换到自定义报表Frame return d.FindElement(By.Id("case_volume")); } catch { return null; } }); inputSearch.SendKeys(caseNo.Trim()); var btnSearch = waitGetElementById(wait,"btn_Search"); btnSearch.Click(); var caseLink = wait.Until((d) => { try { return d.FindElement(By.XPath($"//a[normalize-space()='{caseNo.Trim()}']")); } catch { return null; } }); caseLink = driver.FindElement(By.XPath($"//a[normalize-space()='{caseNo.Trim()}']")); caseLink.Click(); driver.SwitchTo().ParentFrame().SwitchTo().Frame(2); IWebElement temDoItemLink = null; string temFinishedDate = ""; foreach (string doItemName in doItemNames) { var DoItemLinks = wait.Until((d) => { return d.FindElements(By.XPath($"//td[@colname='ctrl_proc'][normalize-space()='{doItemName}']")); }); if (DoItemLinks.Count > 0) { var DoItemLink = DoItemLinks[DoItemLinks.Count - 1]; if (string.IsNullOrEmpty(temFinishedDate)) { temFinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text; temDoItemLink = DoItemLink; } else { if (DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text.CompareTo(temFinishedDate) > 0) { temFinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text; temDoItemLink = DoItemLink; } } } } if(temDoItemLink != null) { retObject.CaseStage = temDoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //案件阶段 retObject.DoItemState = temDoItemLink.FindElement(By.XPath("following-sibling::td[2]")).Text; //处理事项处理状态 retObject.InternalDate = temDoItemLink.FindElement(By.XPath("following-sibling::td[4]")).Text; //内部期限 retObject.CustomerLimitDate = temDoItemLink.FindElement(By.XPath("following-sibling::td[5]")).Text; //客户期限 retObject.FinishedDate = temDoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text; //处理事项完成日 retObject.DoPersons = temDoItemLink.FindElement(By.XPath("following-sibling::td[8]")).Text; //处理人 retObject.DoItemMemo = temDoItemLink.FindElement(By.XPath("following-sibling::td[9]")).Text; //处理事项备注 retObject.Reviewer = temDoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //核稿人 retObject.DoItem = temDoItemLink.Text; //temDoItemLink = DoItemLink; temDoItemLink.Click(); } else { throw new ApplicationException("处理事项不存在!"); } var p_proc_finish_doc_date = wait.Until((d) => { try { return d.FindElement(By.Id("p_proc_info__finish_doc_date")); } catch { return null; } }); //System.Threading.Thread.Sleep(500); retObject.FinalizationDate = p_proc_finish_doc_date.GetAttribute("value"); //定稿日 retObject.ReturnDate = driver.FindElement(By.Id("p_proc_info__back_date")).GetAttribute("value"); //返稿日 retObject.Reviewer = driver.FindElement(By.Id("p_proc_info__revise_user")).GetAttribute("value"); //核稿人 retObject.DoItemCoefficient = driver.FindElement(By.Id("p_proc_info__proc_coefficient")).GetAttribute("value"); //处理事项系数 retObject.WordCount = driver.FindElement(By.Id("p_proc_info__translate_count")).GetAttribute("value"); //翻译字数 driver.FindElement(By.Id("libase")).Click(); var p_case_info__case_name = wait.Until((d) => { try { return d.FindElement(By.Id("p_case_info__case_name")); } catch { return null; } }); retObject.CaseName = p_case_info__case_name.GetAttribute("value"); //案件名称 retObject.CustomerName = driver.FindElement(By.Id("p_case_info__customer_id")).GetAttribute("value"); //客户名称 retObject.BusinessType = driver.FindElement(By.Id("p_case_info__business_type_id")).GetAttribute("value"); //业务类型 retObject.CaseState = GetSelectText(driver.FindElement(By.Id("p_case_info__case_status_id"))); retObject.ApplicationType = GetSelectText(driver.FindElement(By.Id("p_case_info__apply_type_id"))); retObject.CaseType = driver.FindElement(By.Id("p_case_info__case_type_id")).GetAttribute("value"); //案件类型 retObject.EntrustingDate = driver.FindElement(By.Id("p_case_info__charge_date")).GetAttribute("value"); //委案日期 retObject.CaseMemo = driver.FindElement(By.Id("p_case_info__remark")).GetAttribute("value"); //案件备注 driver.FindElement(By.XPath($"//span[contains(text(),'扩展信息')]")).Click(); //select[@id='p_case_info__case_coefficient_id'] retObject.CaseCoefficient = GetSelectText(driver.FindElement(By.Id("p_case_info__case_coefficient_id"))); } catch (Exception ex) { throw new Exception(ex.Message, ex); } finally { driver.Quit(); killChromProcess(); } } Service.Dispose(); } return retObject; } /// /// 获取案件处理事项记录 /// /// 我方文号 /// 处理事项 /// public static dynamic GetPerformanceRecord(string caseNo,string doItemName,string caseStage=null) { if (caseNo.StartsWith("APCN")) { //商标 return GetAPCNPerformanceRecord(caseNo, doItemName, caseStage); } dynamic retObject = new ExpandoObject(); retObject.CaseNo = caseNo.Trim(); retObject.DoItem = doItemName; using (var Service = ChromeDriverService.CreateDefaultService(ConfigHelper.GetSectionValue("IPEasySetting:ChormeDriverPath"))) { Service.Start(); using (IWebDriver driver = CreateChromeDriver()) { try { WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(20)); Login(driver, wait); //点击顶部菜单栏中的案件管理菜单 waitGetElementByName(wait,"71A7CC35-F597-40E1-9FEF-BE622A3A3B63").Click(); //点击左侧 查询 菜单 waitGetElementByName(wait, "c3266ab3-521a-4815-8aaf-7dd0bc5a76af").Click(); driver.SwitchTo().Frame(1); var inputSearch = wait.Until((d) => { try { return d.FindElement(By.Id("case_volume")); } catch { return null; } }); inputSearch.SendKeys(caseNo.Trim()); var btnSearch = waitGetElementById(wait,"btn_Search"); btnSearch.Click(); var caseLink = wait.Until((d) => { try { return d.FindElement(By.XPath($"//a[normalize-space()='{caseNo.Trim()}']")); } catch { return null; } }); caseLink.Click(); driver.SwitchTo().ParentFrame().SwitchTo().Frame(2); var DoItemLinks = wait.Until((d) => { return d.FindElements(By.XPath($"//td[@colname='ctrl_proc'][normalize-space()='{doItemName}']")); }); if (DoItemLinks.Count > 0) { if (!string.IsNullOrEmpty(caseStage)) { foreach (var DoItemLink in DoItemLinks) { var temCaseStage = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; if (temCaseStage == caseStage) { retObject.CaseStage = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //案件阶段 retObject.DoItemState = DoItemLink.FindElement(By.XPath("following-sibling::td[2]")).Text; //处理事项处理状态 retObject.InternalDate = DoItemLink.FindElement(By.XPath("following-sibling::td[4]")).Text; //内部期限 retObject.CustomerLimitDate = DoItemLink.FindElement(By.XPath("following-sibling::td[5]")).Text; //客户期限 retObject.FinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text; //处理事项完成日 retObject.DoPersons = DoItemLink.FindElement(By.XPath("following-sibling::td[8]")).Text; //处理人 retObject.DoItemMemo = DoItemLink.FindElement(By.XPath("following-sibling::td[9]")).Text; //处理事项备注 retObject.Reviewer = DoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //核稿人 DoItemLink.Click(); break; } } } else { var DoItemLink = DoItemLinks[DoItemLinks.Count - 1]; retObject.CaseStage = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //案件阶段 retObject.DoItemState = DoItemLink.FindElement(By.XPath("following-sibling::td[2]")).Text; //处理事项处理状态 retObject.InternalDate = DoItemLink.FindElement(By.XPath("following-sibling::td[4]")).Text; //内部期限 retObject.CustomerLimitDate = DoItemLink.FindElement(By.XPath("following-sibling::td[5]")).Text; //客户期限 retObject.FinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text; //处理事项完成日 retObject.DoPersons = DoItemLink.FindElement(By.XPath("following-sibling::td[8]")).Text; //处理人 retObject.DoItemMemo = DoItemLink.FindElement(By.XPath("following-sibling::td[9]")).Text; //处理事项备注 retObject.Reviewer = DoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //核稿人 DoItemLink.Click(); } } var p_proc_finish_doc_date = wait.Until((d) => { try { return d.FindElement(By.Id("p_proc_info__finish_doc_date")); } catch { return null; } }); retObject.FinalizationDate = p_proc_finish_doc_date.GetAttribute("value"); //定稿日 retObject.ReturnDate = driver.FindElement(By.Id("p_proc_info__back_date")).GetAttribute("value"); //返稿日 retObject.Reviewer = driver.FindElement(By.Id("p_proc_info__revise_user")).GetAttribute("value"); //核稿人 retObject.DoItemCoefficient = driver.FindElement(By.Id("p_proc_info__proc_coefficient")).GetAttribute("value"); //处理事项系数 retObject.WordCount = driver.FindElement(By.Id("p_proc_info__translate_count")).GetAttribute("value"); //翻译字数 waitGetElementById(wait, "libase").Click(); var p_case_info__case_name = wait.Until((d) => { try { return d.FindElement(By.Id("p_case_info__case_name")); } catch { return null; } }); retObject.CaseName = p_case_info__case_name.GetAttribute("value"); //案件名称 retObject.CustomerName = driver.FindElement(By.Id("p_case_info__customer_id")).GetAttribute("value"); //客户名称 retObject.BusinessType = driver.FindElement(By.Id("p_case_info__business_type_id")).GetAttribute("value"); //业务类型 retObject.CaseState = GetSelectText(driver.FindElement(By.Id("p_case_info__case_status_id"))); retObject.ApplicationType = GetSelectText(driver.FindElement(By.Id("p_case_info__apply_type_id"))); retObject.CaseType = driver.FindElement(By.Id("p_case_info__case_type_id")).GetAttribute("value"); //案件类型 retObject.EntrustingDate = driver.FindElement(By.Id("p_case_info__charge_date")).GetAttribute("value"); //委案日期 retObject.CaseMemo = driver.FindElement(By.Id("p_case_info__remark")).GetAttribute("value"); //案件备注 driver.FindElement(By.XPath($"//span[contains(text(),'扩展信息')]")).Click(); retObject.CaseCoefficient = GetSelectText(driver.FindElement(By.Id("p_case_info__case_coefficient_id"))); } catch (Exception ex) { throw new Exception(ex.Message, ex); } finally { driver.Quit(); killChromProcess(); } } Service.Dispose(); } return retObject; } private static dynamic GetAPCNPerformanceRecord(string caseNo, string doItemName, string caseStage = null) { dynamic retObject = new ExpandoObject(); retObject.CaseNo = caseNo.Trim(); retObject.DoItem = doItemName; using (var Service = ChromeDriverService.CreateDefaultService(ConfigHelper.GetSectionValue("IPEasySetting:ChormeDriverPath"))) { Service.Start(); using (IWebDriver driver = CreateChromeDriver()) { try { WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(20)); Login(driver, wait); //点击顶部菜单栏中的案件管理菜单 driver.FindElement(By.Name("71A7CC35-F597-40E1-9FEF-BE622A3A3B63")).Click(); System.Threading.Thread.Sleep(500); //点击左侧 查询 菜单 driver.FindElement(By.Name("FF4E1FF9-FE36-4F0F-99DF-81E60817722E")).Click(); driver.SwitchTo().Frame(1); var inputSearch = wait.Until((d) => { try { //切换到自定义报表Frame return d.FindElement(By.Id("case_volume")); } catch { return null; } }); inputSearch.SendKeys(caseNo.Trim()); var btnSearch = waitGetElementById(wait,"btn_Search"); btnSearch.Click(); var caseLink = wait.Until((d) => { try { return d.FindElement(By.XPath($"//a[normalize-space()='{caseNo.Trim()}']")); } catch { return null; } }); caseLink.Click(); driver.SwitchTo().ParentFrame().SwitchTo().Frame(2); var DoItemLinks = wait.Until((d) => { return driver.FindElements(By.XPath($"//td[@colname='ctrl_proc'][normalize-space()='{doItemName}']")); }); if (DoItemLinks.Count > 0) { if (!string.IsNullOrEmpty(caseStage)) { foreach (var DoItemLink in DoItemLinks) { var temCaseStage = wait.Until((d) => { return DoItemLink.FindElement(By.XPath("following-sibling::td[1]")); }).Text; if (temCaseStage == caseStage) { retObject.CaseStage = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //案件阶段 retObject.DoItemState = DoItemLink.FindElement(By.XPath("following-sibling::td[2]")).Text; //处理事项处理状态 retObject.InternalDate = DoItemLink.FindElement(By.XPath("following-sibling::td[4]")).Text; //内部期限 retObject.CustomerLimitDate = DoItemLink.FindElement(By.XPath("following-sibling::td[5]")).Text; //客户期限 retObject.FinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text; //处理事项完成日 retObject.DoPersons = DoItemLink.FindElement(By.XPath("following-sibling::td[8]")).Text; //处理人 retObject.DoItemMemo = DoItemLink.FindElement(By.XPath("following-sibling::td[9]")).Text; //处理事项备注 retObject.Reviewer = DoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //核稿人 DoItemLink.Click(); //driver.ExecuteJavaScript("$(arguments[0]).click()", DoItemLink); break; } } } else { var DoItemLink = DoItemLinks[DoItemLinks.Count - 1]; //retObject.CaseStage = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //案件阶段 retObject.DoItemState = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //处理事项处理状态 retObject.InternalDate = DoItemLink.FindElement(By.XPath("following-sibling::td[3]")).Text; //内部期限 retObject.CustomerLimitDate = DoItemLink.FindElement(By.XPath("following-sibling::td[4]")).Text; //客户期限 retObject.FinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[6]")).Text; //处理事项完成日 retObject.DoPersons = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text; //处理人 retObject.DoItemMemo = DoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //处理事项备注 //retObject.Reviewer = DoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //核稿人 DoItemLink.Click(); //new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(DoItemLink)).Click(); } } var p_proc_finish_doc_date = wait.Until((d) => { try { return d.FindElement(By.Id("p_proc_info__finish_doc_date")); } catch { return null; } }); //System.Threading.Thread.Sleep(500); retObject.FinalizationDate = p_proc_finish_doc_date.GetAttribute("value"); //定稿日 retObject.ReturnDate = driver.FindElement(By.Id("p_proc_info__back_date")).GetAttribute("value"); //返稿日 retObject.Reviewer = driver.FindElement(By.Id("p_proc_info__revise_user")).GetAttribute("value"); //核稿人 retObject.DoItemCoefficient = driver.FindElement(By.Id("p_proc_info__proc_coefficient")).GetAttribute("value"); //处理事项系数 retObject.WordCount = driver.FindElement(By.Id("p_proc_info__translate_count")).GetAttribute("value"); //翻译字数 waitGetElementById(wait,"libase").Click(); var p_case_info__case_name = wait.Until((d) => { try { return d.FindElement(By.Id("p_case_info__case_name")); } catch { return null; } }); //System.Threading.Thread.Sleep(500); retObject.CaseName = p_case_info__case_name.GetAttribute("value"); //案件名称 retObject.CustomerName = driver.FindElement(By.Id("p_case_info__customer_id")).GetAttribute("value"); //客户名称 retObject.BusinessType = driver.FindElement(By.Id("p_case_info__business_type_id")).GetAttribute("value"); //业务类型 retObject.CaseState = GetSelectText(driver.FindElement(By.Id("p_case_info__case_status_id"))); retObject.ApplicationType = GetSelectText(driver.FindElement(By.Id("p_case_info__apply_type_id"))); retObject.CaseType = driver.FindElement(By.Id("p_case_info__case_type_id")).GetAttribute("value"); //案件类型 retObject.EntrustingDate = driver.FindElement(By.Id("p_case_info__charge_date")).GetAttribute("value"); //委案日期 retObject.CaseMemo = driver.FindElement(By.Id("p_case_info__remark")).GetAttribute("value"); //案件备注 //driver.FindElement(By.XPath($"//span[contains(text(),'扩展信息')]")).Click(); //select[@id='p_case_info__case_coefficient_id'] //retObject.CaseCoefficient = GetSelectText(driver.FindElement(By.Id("p_case_info__case_coefficient_id"))); } catch (Exception ex) { throw new Exception(ex.Message, ex); } finally { driver.Quit(); killChromProcess(); } } Service.Dispose(); } return retObject; } private static void killChromProcess() { try { Process[] workers = Process.GetProcessesByName("Chrome"); foreach (Process worker in workers) { worker.Kill(); worker.WaitForExit(); worker.Dispose(); } workers = Process.GetProcessesByName("Chromedriver"); foreach (Process worker in workers) { worker.Kill(); worker.WaitForExit(); worker.Dispose(); } } catch { } } private static string GetSelectText(IWebElement element) { var strValue = element.GetAttribute("value"); if (string.IsNullOrEmpty(strValue)) { return null; } var ops = element.FindElements(By.TagName("option")); foreach (var op in ops) { if (op.GetAttribute("value") == strValue) { return op.Text; } } return null; } } }