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 OpenQA.Selenium; using OpenQA.Selenium.Chrome; 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 string WaitForFileDownload(string downloadDir, TimeSpan timeout) { string fileName = null; DateTime startTime = DateTime.Now; while (DateTime.Now - startTime < timeout) { if (Directory.GetFiles(downloadDir).Length > 0) { fileName = Directory.GetFiles(downloadDir).FirstOrDefault(); break; } Thread.Sleep(100); } while (File.Exists(fileName) && DateTime.Now - startTime < timeout) { // 检查文件是否完成写入(文件大小是否稳定) long previousSize = 0; long currentSize = new FileInfo(fileName).Length; while (previousSize != currentSize && currentSize>0) { //Debug.WriteLine($"{fileName}文件大小:{previousSize},{currentSize}"); previousSize = currentSize; try { //文件在下载完后,临时文件可能就不存在了, //这时会导致下边的语句会抛出错误 currentSize = new FileInfo(fileName).Length; } catch (Exception ex) { Debug.WriteLine($"获取文件出错大小:{ex.Message}"); break; } //Debug.WriteLine("等待一段时间!"); //Debug.WriteLine($"{fileName}文件大小:{previousSize},{currentSize}"); Thread.Sleep(3000); // 等待一段时间 } if (previousSize == currentSize) { if ((fileName.Contains(".crdownload") || fileName.Contains(".tmp")) && File.Exists(fileName)) { //Debug.WriteLine(".crdownload文件,等待!"); Thread.Sleep(1000); } else { //Debug.WriteLine($"文件大小相同跳出循环"); break; } } } fileName = Directory.GetFiles(downloadDir).FirstOrDefault(); while((fileName.Contains(".crdownload") || fileName.Contains(".tmp")) && !string.IsNullOrEmpty(fileName)){ fileName = Directory.GetFiles(downloadDir).FirstOrDefault(); Thread.Sleep(1000); } return Directory.GetFiles(downloadDir).FirstOrDefault(); } static bool fileInFolder(string strFolder,string filename,out string outFilePath) { if (File.Exists(Path.Combine(strFolder, filename))) { outFilePath = Path.Combine(strFolder, filename); return true; } else { outFilePath = null; if (Directory.Exists(strFolder)) { foreach (var f in new DirectoryInfo(strFolder).GetFiles()) { string temName = f.Name.Trim(); if (temName == filename || temName.Replace("\u00A0", "").Replace(" ","") == filename.Replace("\u00A0", "").Replace(" ", "")) { outFilePath = f.FullName; return true; } } return false; } else { return false; } } } static bool WaitForFileDownload(string downloadDir, string fileName, TimeSpan timeout,out string outfile) { DateTime startTime = DateTime.Now; while (DateTime.Now - startTime < timeout) { string filePath = Path.Combine(downloadDir, fileName); if (fileInFolder(downloadDir, fileName, out filePath)) { // 检查文件是否完成写入(文件大小是否稳定) long previousSize = 0; long currentSize = new FileInfo(filePath).Length; while (previousSize != currentSize) { Thread.Sleep(1000); // 等待一段时间 previousSize = currentSize; currentSize = new FileInfo(filePath).Length; } outfile = filePath; return true; // 文件下载完成 } Thread.Sleep(1000); // 等待文件出现 } outfile = null; 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; } }); } private static string CopyFile(string strfile) { if(strfile == null) { return null; } string fileName = new FileInfo(strfile).Name; string desfile = Path.Combine(strFileSavePath, fileName); if (File.Exists(desfile)) { File.Delete(desfile); } File.Copy(strfile, desfile); File.Delete(strfile); return desfile; } /// /// 获取指定案号的专利申请案的基本信息和初稿文件、定稿文件和第一次返稿文件 /// /// /// /// public static dynamic DownloadCaseFiles(string caseNo) { dynamic retObject = new ExpandoObject(); string[] splitCase = caseNo.Split(new[] { '-' }); if(splitCase.Length > 1) { string temCaseNo = ""; for(int i = 0; i < splitCase.Length - 1; i++) { temCaseNo = string.IsNullOrEmpty(temCaseNo)?splitCase[i]:$"{temCaseNo}-{splitCase[i]}"; } caseNo = temCaseNo.Trim(); } retObject.CaseNo = caseNo.Trim(); string strDownloadPath = Path.Combine(strFileSavePath, caseNo); if (!Directory.Exists(strDownloadPath)) { Directory.CreateDirectory(strDownloadPath); } using (IWebDriver driver = CreateChromeDriver(strDownloadPath)) { try { WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5)); 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")); System.Threading.Thread.Sleep(200); driver.ExecuteJavaScript("arguments[0].click();",btnSearch); //btnSearch.Click(); //System.Threading.Thread.Sleep(500); try { var caseLink = wait.Until((d) => { try { return d.FindElement(By.XPath($"//a[contains(text(),'{caseNo}')]")); } catch { return null; } }); driver.ExecuteJavaScript("arguments[0].click();", caseLink); } catch(Exception ex) { throw(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"); #region 下载新申请第一次返稿文档 retObject.firstReturnFile = null; var kzTab = wait.Until(d => d.FindElement(By.XPath($"//span[contains(text(),'往来信息')]"))); kzTab.Click(); var kzTable = waitGetElementById(wait, "table_SendList"); System.Threading.Thread.Sleep(500); var retRows = GetWeidijiaoFile(driver, wait, kzTable); foreach ( var row in retRows) { var btnDownload = waitGetElementByClassName(wait, "tbview", row[row.Count - 1]); driver.ExecuteJavaScript("arguments[0].click();", btnDownload); driver.SwitchTo().DefaultContent() .SwitchTo().Frame(3); System.Threading.Thread.Sleep (1000); var attachTable = wait.Until(d => d.FindElement(By.Id($"table_mailfile"))); System.Threading.Thread.Sleep(1000); retObject.firstReturnFile = Download(driver, wait, attachTable, new { fileNameCol = 2, fileTypeCol = -1, uploadDateCol = 6 }, "新申请第一次返稿", strDownloadPath, new string[] { "申请文件","申请文档","说明书"}, new string[] { "检索报告", "查新报告","交底书","对比文件","图档" }); driver.SwitchTo().ParentFrame(); var closer = wait.Until((d) => { return driver.FindElement(By.XPath("//li[@class=\"active\"]/div[@title=\"关闭\"]")); }); closer.Click(); driver.SwitchTo().Frame(2); if (retObject.firstReturnFile != null) { retObject.firstReturnFile = CopyFile(retObject.firstReturnFile); break; } } if (retRows.Count > 0 && retObject.firstReturnFile ==null) { throw new Exception("未抓取到第一次返稿文件!"); } #endregion 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").Replace(";",""); //核稿人 //第一次初稿日 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"); retObject.FinishedDate = waitGetElementById(wait, "p_proc_info__finish_date").GetAttribute("value"); //点击附件信息Tab var lifile = driver.FindElement(By.Id("lifile")); driver.ExecuteJavaScript("arguments[0].click();", lifile); //添加从文件清单中获取 //“新申请第一次内审(初稿)、 //新申请第一次返稿(第一次发客户文档)、 //新申请文档(定稿文档)” var table_filelist = waitGetElementById(wait, "table_filelist"); System.Threading.Thread.Sleep(500); //定稿文件 try { retObject.finallyFile = null; retObject.finallyFile = Download(driver, wait, table_filelist, "新申请文档", strDownloadPath); //dynamic config = new { fileNameCol = 2, fileTypeCol = 4, uploadDateCol = 7 }; //retObject.finallyFile = Download(driver, wait, table_filelist, config, "新申请文档", strDownloadPath); retObject.finallyFile = CopyFile(retObject.finallyFile); } catch { } if (retObject.firstReturnFile == null) { //新申请第一次返稿文件 try { retObject.firstReturnFile = Download(driver, wait, table_filelist, "新申请第一次返稿", strDownloadPath); retObject.firstReturnFile = CopyFile(retObject.firstReturnFile); } catch (Exception ex) { } } //初稿文件 try { retObject.draftFile = null; waitGetElementById(wait, "draftfiletoggle").Click(); var table_draffilelist = waitGetElementById(wait, "table_draftfilelist"); System.Threading.Thread.Sleep(500); dynamic config = new { fileNameCol =1,fileTypeCol=3,uploadDateCol=6}; retObject.draftFile = Download( driver, wait, table_draffilelist, config, "新申请第一次内审",strDownloadPath, new string[] { "申请文件", "权利要求" , "申请文档" }, new string[] { "检索报告","查新报告" }); retObject.draftFile = CopyFile(retObject.draftFile); } catch { } if (Directory.Exists(strDownloadPath)) { Directory.Delete(strDownloadPath,true); } } catch (Exception ex) { throw new Exception(ex.Message, ex); } finally { driver.Quit(); killChromProcess(); } } return retObject; } /// /// 获取当前为递交中或前一天完成的新申请案件清单 /// /// 类型0:递交中、1:前一天完成 /// /// public static DataTable GetFinished3FilesCases(int type,DateTime start,DateTime end) { DataTable retObject = new DataTable(); using (IWebDriver driver = CreateChromeDriver()) { try { WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5)); 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); #region 添加检索条件 var chkDoItem = waitGetElementById(wait, "is_proc"); chkDoItem.Click(); var ictrlproc = waitGetElementById(wait, "i_ctrl_proc"); ictrlproc.Click(); var ctrl_proc_id = waitGetElementById(wait, "ctrl_proc_id"); ctrl_proc_id.FindElements(By.TagName("li")); var ellis = waitGetElementsByTagName(wait, "li", ctrl_proc_id); foreach(var elli in ellis) { if(elli.Text == "新申请") { var chk = waitGetElementByClassName(wait, "chk", elli); chk.Click(); break; } System.Diagnostics.Debug.WriteLine(elli.Text); } //var chkXSQ = waitGetElementById(wait, "ctrl_proc_id_4_check"); //chkXSQ.Click(); var btnOk = waitGetElementById(wait, "ctrl_proc_ida_ok"); btnOk.Click(); waitGetElementById(wait,"proc_status").Click(); if (type == 0) { waitGetElementById(wait, "procstatus_5_check").Click(); waitGetElementById(wait, "procstatusa_ok").Click() ; } else { if(type == 1) { waitGetElementById(wait, "procstatus_12_check").Click(); waitGetElementById(wait, "procstatusa_ok").Click(); Log($"{DateTime.Now}\t输入处理事项完成日期:开始日期"); var startDate = wait.Until((d) => { return d.FindElement(By.Id("finish_date_start")); }); driver.ExecuteJavaScript("arguments[0].scrollIntoView();", startDate); startDate.Click(); System.Threading.Thread.Sleep(500); startDate.SendKeys(start.ToString("yyyy-MM-dd")); Log($"{DateTime.Now}\t输入处理事项完成日期:结束日期"); var endDate = wait.Until((d) => { try { return d.FindElement(By.Id("finish_date_end")); } catch { return null; } }); driver.ExecuteJavaScript("arguments[0].scrollIntoView();", endDate); endDate.Click(); System.Threading.Thread.Sleep (500); endDate.SendKeys(end.ToString("yyyy-MM-dd")); } } //waitGetElementById(wait,"procstatusa_ok").Click(); #endregion #region 导出检索结果 var btnSearch = waitGetElementById(wait, "btn_Search");// driver.FindElement(By.Id("btn_Search")); driver.ExecuteJavaScript("arguments[0].click();", btnSearch); Log($"{DateTime.Now}\t切换到弹出的导出报表窗口,点击导出按钮"); var btnExport = waitGetElementById(wait, "btn_Export"); driver.ExecuteJavaScript("arguments[0].click();", btnExport); 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); //driver.FindElement(By.CssSelector("table tbody tr:first-child")); var firstTr = wait.Until((d) => { return d.FindElement(By.CssSelector("table tbody 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 = wait.Until((d) => { return d.FindElement(By.CssSelector("table tbody tr")); }); tdStatus = firstTr.FindElement(By.XPath(".//td")).FindElement(By.XPath("following-sibling::td[4]")); strStatus = tdStatus.Text; } Log($"{DateTime.Now}\t点击下载按钮下载文档"); firstTr = wait.Until((d) => { return d.FindElement(By.CssSelector("table tbody tr")); }); wait.Until((d)=>{ return firstTr.FindElement(By.XPath(".//td/a[@title='下载']")); }).Click(); var ReportName = $"案件清单({DateTime.Now.ToString("yyyy年M月d日")})"; string strFilePath = System.IO.Path.Combine(strFileSavePath, $"{ReportName.Trim()}.xlsx"); WaitForFileDownload(strFileSavePath, $"{ReportName.Trim()}.xlsx", TimeSpan.FromMinutes(5),out strFilePath); //删除下载记录 Log($"{DateTime.Now}\t删除下载记录"); firstTr = wait.Until((d) => { return d.FindElement(By.CssSelector("table tbody tr")); }); wait.Until((d) => { return firstTr.FindElement(By.XPath(".//td/a[@title='删除']")); }).Click(); #endregion #region 将下载的excel档转换成Datatable retObject = NPOIExcel.ExcelToDataTable(strFilePath.Replace("~", "_"), true,true,1); System.IO.File.Delete(strFilePath.Replace("~", "_")); #endregion } catch (Exception ex) { throw new Exception(ex.Message, ex); } finally { driver.Quit(); //killChromProcess(); } } return retObject; } private static bool fileNameValid(string str, string[] filterStrings) { if (filterStrings.Length == 0) { return true; } else { foreach (string filterString in filterStrings) { if (str.Contains(filterString)) { return true; } } return false; } } private static List> GetWeidijiaoFile(IWebDriver driver, WebDriverWait wait, IWebElement table_filelist) { var tBody = waitGetElementByTagName(wait, "tbody", table_filelist); var Rows = waitGetElementsByTagName(wait, "tr", tBody); List> retRows = new List>(); DateTime dateTime = DateTime.Now; foreach (var row in Rows) { var cols = waitGetElementsByTagName(wait, "td", row); System.Threading.Thread.Sleep(500); if (cols.Count == 1 && cols[0].Text == "无数据") { break; } if (cols[3].Text == "未递交" || (cols[2].Text.Contains("申请") && !cols[2].Text.Contains("受理通知"))) { DateTime temDate = DateTime.Parse(cols[9].Text); if (temDate < dateTime) { retRows.Insert(0, cols); dateTime = temDate; } else { retRows.Add(cols); } } } return retRows; } private static string Download(IWebDriver driver, WebDriverWait wait, IWebElement table_filelist, dynamic config,string fileType, string downloadPath = null, string[] includesStrings = null, string[] unincludeStrings = null) { if(downloadPath == null) { downloadPath = strFileSavePath; } if (unincludeStrings == null) { unincludeStrings = new string[] { }; } if (includesStrings == null) { includesStrings = new string[] { }; } try { driver.ExecuteJavaScript("arguments[0].scrollIntoView();", table_filelist); } catch { } var tBody = waitGetElementByTagName(wait, "tbody", table_filelist); var Rows = waitGetElementsByTagName(wait, "tr", tBody); ReadOnlyCollection temRow =null; ReadOnlyCollection temRow1 = null; DateTime dateTime = DateTime.Now; DateTime dateTime1 = DateTime.Now; foreach (var row in Rows) { var cols = waitGetElementsByTagName(wait,"td",row); System.Threading.Thread.Sleep(500); if (cols!=null && cols.Count ==1 && cols[0].Text == "无数据") { break; } if (config.fileTypeCol>0 && cols[config.fileTypeCol].Text == fileType) { temRow = cols; break; } else { if(unincludeStrings.Length ==0 || ((unincludeStrings.Length > 0) && !fileNameValid(cols[config.fileNameCol].Text, unincludeStrings) )) { DateTime temDate = DateTime.Parse(cols[config.uploadDateCol].Text); if (fileNameValid(cols[config.fileNameCol].Text, includesStrings)) { if (temRow == null) { temRow = cols; dateTime = temDate; } else { if (temDate < dateTime) { temRow = cols; dateTime = temDate; } } } else { if (temRow1 == null) { temRow1 = cols; dateTime1 = temDate; } else { if (temDate < dateTime1) { temRow1 = cols; dateTime1 = temDate; } } } } else { DateTime temDate = DateTime.Parse(cols[config.uploadDateCol].Text); if (fileNameValid(cols[config.fileNameCol].Text, includesStrings)) { if (temRow1 == null) { temRow1 = cols; dateTime1 = temDate; } else { if (temDate < dateTime1) { temRow1 = cols; dateTime1 = temDate; } } } } } } if(temRow == null && temRow1 != null) { temRow = temRow1; } if (temRow != null) { //清除下载路径的文件 Directory.Delete(downloadPath, true); Directory.CreateDirectory(downloadPath); var btnDownload = waitGetElementByClassName(wait, "tbdownload", temRow[temRow.Count - 1]); try { driver.ExecuteJavaScript("arguments[0].scrollIntoView();", btnDownload); } catch { } System.Threading.Thread.Sleep(500); driver.ExecuteJavaScript("arguments[0].click();", btnDownload); #region 等待文件下载完 string filePath = WaitForFileDownload(downloadPath, TimeSpan.FromMinutes(5)); return filePath; #endregion } return null; } private static string Download(IWebDriver driver, WebDriverWait wait, IWebElement table_filelist, string fileType,string downloadPath=null) { try { driver.ExecuteJavaScript("arguments[0].scrollIntoView();", table_filelist); } catch { } if (string.IsNullOrEmpty(downloadPath)) { downloadPath = strFileSavePath; } var tBody = waitGetElementByTagName(wait, "tbody", table_filelist); var finallyFiles = wait.Until((d) => { try { return tBody.FindElements(By.XPath($".//td[@colname='file_desc'][normalize-space()='{fileType}']")); } catch { return null; } }); if(finallyFiles == null && finallyFiles.Count>0) { return null; } foreach (var finallyFile in finallyFiles) { 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; } if (fileName.Contains(".doc")) { string filePath = System.IO.Path.Combine(downloadPath, fileName); if (System.IO.File.Exists(filePath)) { System.IO.File.Delete(filePath); } var btnDownload = finallyFile.FindElement(By.XPath("following-sibling::*[4]")); btnDownload = waitGetElementByClassName(wait, "tbdownload", btnDownload); driver.ExecuteJavaScript("arguments[0].click();", btnDownload); WaitForFileDownload(downloadPath, fileName, TimeSpan.FromMinutes(5), out filePath); return filePath; } } return null; } 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(10)); 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(); string strRetFile = null; WaitForFileDownload(strFileSavePath, filename, TimeSpan.FromMinutes(5),out strRetFile); } 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(string downloadPath=null) { try { 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); // 禁止下载提示 if (!string.IsNullOrEmpty(downloadPath)) { options.AddUserProfilePreference("download.default_directory", downloadPath); } else { 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; } catch(Exception ex) { throw new Exception("创建chrome driver 出错!",ex); } } /// /// 根据报表名称导出报表 /// /// 报告名称 /// 是否手动修改日期范围 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(10)); 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_')]")); }); //将界面滚动到开始日期栏位,以使开始日期栏位可见 driver.ExecuteJavaScript("arguments[0].scrollIntoView();", startDate); startDate.Click(); System.Threading.Thread.Sleep(3000); 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(); System.Threading.Thread.Sleep(3000); 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; } }); driver.ExecuteJavaScript("arguments[0].click();",linkExport); //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 = wait.Until((d) => { return d.FindElement(By.CssSelector("table tbody tr")); }); var tdStatus = wait.Until((d) => { return 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 = wait.Until((d) => { return d.FindElement(By.CssSelector("table tbody tr")); }); tdStatus = wait.Until((d) => { return firstTr.FindElement(By.XPath(".//td")).FindElement(By.XPath("following-sibling::td[4]")); }); strStatus = tdStatus.Text; } Log($"{DateTime.Now}\t点击下载按钮下载文档"); firstTr = wait.Until((d) => { return d.FindElement(By.CssSelector("table tbody 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), out strFilePath); //删除下载记录 Log($"{DateTime.Now}\t删除下载记录"); firstTr = wait.Until((d) => { return d.FindElement(By.CssSelector("table tbody 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(10)); 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").Replace("(null)",""); //客户名称 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(10)); 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(); System.Threading.Thread.Sleep(200); driver.SwitchTo().ParentFrame().SwitchTo().Frame(2); IWebElement temDoItemLink = null; string temFinishedDate = ""; string xpathQuery = ""; foreach (string doItemName in doItemNames) { xpathQuery = string.IsNullOrEmpty(xpathQuery) ? $"normalize-space()='{doItemName}'" : $"{xpathQuery} or normalize-space()='{doItemName}'"; } //foreach (string doItemName in doItemNames) //{ var DoItemLinks = wait.Until((d) => { d.SwitchTo().DefaultContent().SwitchTo().Frame(2); return d.FindElements(By.XPath($"//td[@colname='ctrl_proc' and ({xpathQuery})]")); }); 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.ExternalHandler = temDoItemLink.FindElement(By.XPath("following-sibling::td[9]")).Text; //对外处理人 retObject.Reviewer = temDoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text.Replace(";",""); //核稿人 retObject.DoItemMemo = temDoItemLink.FindElement(By.XPath("following-sibling::td[12]")).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.Contains("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(10)); 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(); System.Threading.Thread.Sleep(200); var DoItemLinks = wait.Until((d) => { d.SwitchTo().DefaultContent().SwitchTo().Frame(2); 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.ExternalHandler = DoItemLink.FindElement(By.XPath("following-sibling::td[9]")).Text; //对外处理人 retObject.Reviewer = DoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //核稿人 retObject.DoItemMemo = DoItemLink.FindElement(By.XPath("following-sibling::td[12]")).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.ExternalHandler = DoItemLink.FindElement(By.XPath("following-sibling::td[9]")).Text; //对外处理人 retObject.Reviewer = DoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //核稿人 retObject.DoItemMemo = DoItemLink.FindElement(By.XPath("following-sibling::td[12]")).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").Replace("(null)",""); //客户名称 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(10)); 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.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; //处理事项备注 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; } } }