IPEasyUtility.cs 63 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Data;
  5. using System.Diagnostics;
  6. using System.Dynamic;
  7. using System.IO;
  8. using System.Linq;
  9. using System.Threading;
  10. using System.Xml.Linq;
  11. using NPOI.HPSF;
  12. using OpenQA.Selenium;
  13. using OpenQA.Selenium.Chrome;
  14. using OpenQA.Selenium.Interactions;
  15. using OpenQA.Selenium.Support.Extensions;
  16. using OpenQA.Selenium.Support.UI;
  17. namespace wispro.sp.utility
  18. {
  19. public class IPEasyUtility
  20. {
  21. static string strFileSavePath = ConfigHelper.GetSectionValue("IPEasySetting:DownloadFileSavePath");
  22. static string Account = ConfigHelper.GetSectionValue("IPEasySetting:Account");
  23. static string Password = ConfigHelper.GetSectionValue("IPEasySetting:Password");
  24. static bool WaitForFileDownload(string downloadDir, string fileName, TimeSpan timeout)
  25. {
  26. DateTime startTime = DateTime.Now;
  27. while (DateTime.Now - startTime < timeout)
  28. {
  29. string filePath = Path.Combine(downloadDir, fileName);
  30. if (File.Exists(filePath))
  31. {
  32. // 检查文件是否完成写入(文件大小是否稳定)
  33. long previousSize = 0;
  34. long currentSize = new FileInfo(filePath).Length;
  35. while (previousSize != currentSize)
  36. {
  37. Thread.Sleep(1000); // 等待一段时间
  38. previousSize = currentSize;
  39. currentSize = new FileInfo(filePath).Length;
  40. }
  41. return true; // 文件下载完成
  42. }
  43. Thread.Sleep(1000); // 等待文件出现
  44. }
  45. return false; // 超时,文件未下载完成
  46. }
  47. static IWebElement waitGetElementById(WebDriverWait wait,string id,IWebElement parentElement =null)
  48. {
  49. return wait.Until((d) =>
  50. {
  51. try
  52. {
  53. if (parentElement == null)
  54. {
  55. return d.FindElement(By.Id(id));
  56. }
  57. else
  58. {
  59. return parentElement.FindElement(By.Id(id));
  60. }
  61. }
  62. catch {
  63. return null;
  64. }
  65. });
  66. }
  67. static IWebElement waitGetElementByName(WebDriverWait wait, string name, IWebElement parentElement = null)
  68. {
  69. return wait.Until((d) =>
  70. {
  71. try
  72. {
  73. if (parentElement == null)
  74. {
  75. return d.FindElement(By.Name(name));
  76. }
  77. else
  78. {
  79. return parentElement.FindElement(By.Name(name));
  80. }
  81. }
  82. catch
  83. {
  84. return null;
  85. }
  86. });
  87. }
  88. static IWebElement waitGetElementByTagName(WebDriverWait wait, string name, IWebElement parentElement = null)
  89. {
  90. return wait.Until((d) =>
  91. {
  92. try
  93. {
  94. if (parentElement == null)
  95. {
  96. return d.FindElement(By.TagName(name));
  97. }
  98. else
  99. {
  100. return parentElement.FindElement(By.TagName(name));
  101. }
  102. }
  103. catch
  104. {
  105. return null;
  106. }
  107. });
  108. }
  109. static ReadOnlyCollection<IWebElement> waitGetElementsByName(WebDriverWait wait, string name, IWebElement parentElement = null)
  110. {
  111. return wait.Until((d) =>
  112. {
  113. try
  114. {
  115. if (parentElement == null)
  116. {
  117. return d.FindElements(By.Name(name));
  118. }
  119. else
  120. {
  121. return parentElement.FindElements(By.Name(name));
  122. }
  123. }
  124. catch
  125. {
  126. return null;
  127. }
  128. });
  129. }
  130. static ReadOnlyCollection<IWebElement> waitGetElementsByTagName(WebDriverWait wait, string name, IWebElement parentElement = null)
  131. {
  132. return wait.Until((d) =>
  133. {
  134. try
  135. {
  136. if (parentElement == null)
  137. {
  138. return d.FindElements(By.TagName(name));
  139. }
  140. else
  141. {
  142. return parentElement.FindElements(By.TagName(name));
  143. }
  144. }
  145. catch
  146. {
  147. return null;
  148. }
  149. });
  150. }
  151. static IWebElement waitGetElementByClassName(WebDriverWait wait, string name, IWebElement parentElement = null)
  152. {
  153. return wait.Until((d) =>
  154. {
  155. try
  156. {
  157. if (parentElement == null)
  158. {
  159. return d.FindElement(By.ClassName(name));
  160. }
  161. else
  162. {
  163. return parentElement.FindElement(By.ClassName(name));
  164. }
  165. }
  166. catch
  167. {
  168. return null;
  169. }
  170. });
  171. }
  172. /// <summary>
  173. /// 获取指定案号的专利申请案的基本信息和初稿文件、定稿文件和第一次返稿文件
  174. /// </summary>
  175. /// <param name="caseNo"></param>
  176. /// <returns></returns>
  177. /// <exception cref="Exception"></exception>
  178. public static dynamic DownloadCaseFiles(string caseNo)
  179. {
  180. dynamic retObject = new ExpandoObject();
  181. retObject.CaseNo = caseNo.Trim();
  182. using (IWebDriver driver = CreateChromeDriver())
  183. {
  184. try
  185. {
  186. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));
  187. Login(driver, wait);
  188. //点击顶部菜单栏中的案件管理菜单
  189. IWebElement linkCaseManager = waitGetElementByName(wait, "71A7CC35-F597-40E1-9FEF-BE622A3A3B63");
  190. linkCaseManager.Click();
  191. IWebElement linkCaseSearch = wait.Until((d) =>
  192. {
  193. try
  194. {
  195. return driver.FindElement(By.LinkText("案件查询"));
  196. }
  197. catch
  198. {
  199. return null;
  200. }
  201. });
  202. driver.ExecuteJavaScript("arguments[0].click();", linkCaseSearch);
  203. //linkCaseSearch.Click();
  204. IWebElement patentSearch = waitGetElementByName(wait, "4df7eee3-426f-4ce5-9204-34ccb0fd27f7");
  205. driver.ExecuteJavaScript("arguments[0].click();", patentSearch);
  206. //patentSearch.Click();
  207. driver.SwitchTo().Frame(1);
  208. var inputSearch = waitGetElementById(wait, "case_volume");//driver.FindElement(By.Id("case_volume"));
  209. inputSearch.SendKeys(caseNo.Trim());
  210. var btnSearch = waitGetElementById(wait, "btn_Search");// driver.FindElement(By.Id("btn_Search"));
  211. btnSearch.Click();
  212. try
  213. {
  214. var caseLink = wait.Until((d) => {
  215. return d.FindElement(By.XPath($"//a[contains(text(),'{caseNo}')]"));
  216. });
  217. caseLink.Click();
  218. }
  219. catch(Exception ex)
  220. {
  221. if(ex.Message.Contains("no such element: Unable to locate element"))
  222. {
  223. return retObject;
  224. }
  225. }
  226. System.Threading.Thread.Sleep(1000);
  227. driver.SwitchTo().ParentFrame();
  228. driver.SwitchTo().Frame(2);
  229. //案件名称
  230. retObject.CaseName = waitGetElementById(wait, "p_case_info__case_name").GetAttribute("value");
  231. //我方文号
  232. retObject.CaseNo = waitGetElementById(wait, "p_case_info__case_volume").GetAttribute("value");
  233. //案件类型
  234. retObject.CaseType = waitGetElementById(wait, "p_case_info__case_type_id").GetAttribute("value");
  235. //申请类型
  236. var selectElement = waitGetElementById(wait, "p_case_info__apply_type_id");
  237. retObject.ApplicationType = new SelectElement(selectElement).SelectedOption.Text;
  238. //客户
  239. retObject.Customer = waitGetElementById(wait, "p_case_info__customer_id").GetAttribute("value").Replace("(null)", "");
  240. //申请国家
  241. retObject.Country = waitGetElementById(wait, "p_case_info__country_id").GetAttribute("value");
  242. var table = waitGetElementById(wait, "table_ProcList");
  243. var rows = waitGetElementsByTagName(wait, "tr", table);// table.FindElements(By.TagName("tr"));
  244. foreach (var row in rows)
  245. {
  246. var cells = row.FindElements(By.TagName("td"));
  247. if (cells[1].Text == "新申请")
  248. {
  249. var bthEdit = waitGetElementByClassName(wait, "tbedit", cells[12]);
  250. driver.ExecuteJavaScript("arguments[0].click();", bthEdit);
  251. break;
  252. }
  253. }
  254. driver.SwitchTo().ParentFrame().SwitchTo().Frame(0);
  255. //案件阶段
  256. var caseStage = waitGetElementById(wait, "select2-p_proc_info__review_stage-container");
  257. if (caseStage != null && caseStage.Text != "--请选择--")
  258. {
  259. retObject.CaseStage = caseStage.Text;
  260. }
  261. //内部期限
  262. retObject.InternalDate = waitGetElementById(wait, "p_proc_info__int_due_date").GetAttribute("value");
  263. //处理事项系数
  264. var DICoe = waitGetElementById(wait, "p_proc_info__proc_coefficient_id");
  265. retObject.DoItemCoefficient = new SelectElement(DICoe).SelectedOption.Text;
  266. if (retObject.DoItemCoefficient == "请选择")
  267. {
  268. retObject.DoItemCoefficient = "";
  269. }
  270. retObject.DoPersons = waitGetElementById(wait, "pic_list").GetAttribute("value"); //处理人
  271. retObject.Reviewer = waitGetElementById(wait, "rev_list").GetAttribute("value"); //核稿人
  272. //第一次初稿日
  273. retObject.FirstDraftDate = waitGetElementById(wait, "p_proc_info__first_doc_date").GetAttribute("value");
  274. //客户期限
  275. retObject.CustomerLimitDate = waitGetElementById(wait, "p_proc_info__cus_due_date").GetAttribute("value");
  276. //配案日
  277. retObject.CaseAssigmentDate = waitGetElementById(wait, "p_proc_info__allocate_date").GetAttribute("value");
  278. //返稿日
  279. retObject.ReturnDate = waitGetElementById(wait, "p_proc_info__back_date").GetAttribute("value");
  280. //定稿日
  281. retObject.FinalizationDate = waitGetElementById(wait, "p_proc_info__finish_doc_date").GetAttribute("value");
  282. //点击附件信息Tab
  283. var lifile = driver.FindElement(By.Id("lifile"));
  284. driver.ExecuteJavaScript("arguments[0].click();", lifile);
  285. //添加从文件清单中获取“新申请第一次内审 (初稿)、 新申请第一次返稿(第一次发客户文档)、新申请文档(定稿文档)”
  286. var table_filelist = waitGetElementById(wait, "table_filelist");
  287. //定稿文件
  288. try
  289. {
  290. Download(retObject, driver, wait, table_filelist, "新申请文档");
  291. }
  292. catch { }
  293. //新申请第一次返稿文件
  294. try
  295. {
  296. Download(retObject, driver, wait, table_filelist, "新申请第一次返稿");
  297. }
  298. catch { }
  299. //初稿文件
  300. try
  301. {
  302. waitGetElementById(wait, "draftfiletoggle").Click();
  303. var table_draffilelist = waitGetElementById(wait, "table_draftfilelist");// driver.FindElement(By.Id("table_draftfilelist"));
  304. Download(retObject, driver, wait, table_draffilelist, "新申请第一次内审");
  305. }
  306. catch { }
  307. }
  308. catch (Exception ex)
  309. {
  310. throw new Exception(ex.Message, ex);
  311. }
  312. finally
  313. {
  314. driver.Quit();
  315. killChromProcess();
  316. }
  317. }
  318. return retObject;
  319. }
  320. private static void Download(dynamic retObject, IWebDriver driver, WebDriverWait wait, IWebElement table_filelist, string fileType)
  321. {
  322. var tBody = waitGetElementByTagName(wait, "tbody", table_filelist);
  323. var finallyFile = wait.Until((d) =>
  324. {
  325. try {
  326. return tBody.FindElement(By.XPath($".//td[@colname='file_desc'][normalize-space()='{fileType}']"));
  327. }
  328. catch
  329. {
  330. return null;
  331. }
  332. });
  333. if(finallyFile == null)
  334. {
  335. switch (fileType)
  336. {
  337. case "新申请文档":
  338. retObject.finallyFile = null;
  339. break;
  340. case "新申请第一次返稿":
  341. retObject.firstReturnFile = null;
  342. break;
  343. case "新申请第一次内审":
  344. retObject.draftFile = null;
  345. break;
  346. }
  347. return;
  348. }
  349. var tdfileName = wait.Until((d) =>
  350. {
  351. try
  352. {
  353. return finallyFile.FindElement(By.XPath("preceding-sibling::*[2]"));
  354. }
  355. catch
  356. {
  357. return null;
  358. }
  359. });
  360. string fileName = tdfileName.Text;
  361. while (string.IsNullOrEmpty(fileName))
  362. {
  363. System.Threading.Thread.Sleep(100);
  364. fileName = tdfileName.Text;
  365. }
  366. string filePath = System.IO.Path.Combine(strFileSavePath, fileName);
  367. if (System.IO.File.Exists(filePath))
  368. {
  369. System.IO.File.Delete(filePath);
  370. }
  371. switch (fileType)
  372. {
  373. case "新申请文档":
  374. retObject.finallyFile = filePath;
  375. break;
  376. case "新申请第一次返稿":
  377. retObject.firstReturnFile = filePath;
  378. break;
  379. case "新申请第一次内审":
  380. retObject.draftFile = filePath;
  381. break;
  382. }
  383. var btnDownload = finallyFile.FindElement(By.XPath("following-sibling::*[4]"));
  384. btnDownload = waitGetElementByClassName(wait, "tbdownload", btnDownload);
  385. driver.ExecuteJavaScript("arguments[0].click();", btnDownload);
  386. WaitForFileDownload(strFileSavePath, fileName, TimeSpan.FromMinutes(5));
  387. }
  388. private static void Login(IWebDriver driver, WebDriverWait wait)
  389. {
  390. //进入登录界面
  391. driver.Navigate().GoToUrl(ConfigHelper.GetSectionValue("IPEasySetting:IPEasyWeb"));
  392. //输入用户名和密码
  393. waitGetElementById(wait, "txtUser").SendKeys(Account);
  394. waitGetElementById(wait, "txtPwd").SendKeys(Password);
  395. //点击登录按钮
  396. waitGetElementById(wait, "btnLogin").Click();
  397. //关闭提示遮罩层
  398. waitGetElementById(wait, "jpwClose").Click();
  399. }
  400. public static void DownloadReport(string strId,string filename)
  401. {
  402. using (IWebDriver driver = CreateChromeDriver())
  403. {
  404. try
  405. {
  406. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
  407. Login(driver, wait);
  408. //点击顶部菜单栏中的报表管理菜单
  409. waitGetElementById(wait, "970d33d5-c728-41b8-a060-4330610706b9").Click();
  410. //driver.FindElement(By.Name("970d33d5-c728-41b8-a060-4330610706b9")).Click();
  411. //点击左侧 自定义报表 菜单
  412. waitGetElementByName(wait, "642fa96f-1e1f-46fd-aaa4-cb461ee8df5b").Click();
  413. //driver.FindElement(By.Name("642fa96f-1e1f-46fd-aaa4-cb461ee8df5b")).Click();
  414. //切换到自定义报表Frame
  415. driver.SwitchTo().Frame(1);
  416. //调用报表导出JS
  417. ((IJavaScriptExecutor)driver).ExecuteScript($"Report.Export('{strId}');");
  418. //切换到弹出的导出报表窗口,点击导出按钮
  419. driver.SwitchTo().DefaultContent();
  420. var ihg_export = waitGetElementByName(wait, "ihg_export"); //driver.FindElement(By.Name("ihg_export"));
  421. driver.SwitchTo().Frame(ihg_export);
  422. waitGetElementById(wait, "btnSubmit").Click();
  423. //driver.FindElement(By.Id("btnSubmit")).Click();
  424. WaitForFileDownload(strFileSavePath, filename, TimeSpan.FromMinutes(5));
  425. }
  426. catch (Exception ex)
  427. {
  428. throw new Exception(ex.Message);
  429. }
  430. finally
  431. {
  432. driver.Quit();
  433. driver.Dispose();
  434. killChromProcess();
  435. }
  436. }
  437. }
  438. private static void Log(string strMessage)
  439. {
  440. StreamWriter sw = File.AppendText("c:\\temp\\log.txt");
  441. sw.WriteLine($"{strMessage}");
  442. sw.Flush();
  443. sw.Close();
  444. sw.Dispose();
  445. }
  446. private static OpenQA.Selenium.Chrome.ChromeDriver CreateChromeDriver()
  447. {
  448. bool isheadless = (ConfigHelper.GetSectionValue("IPEasySetting:isHeadless") == "true");
  449. var options = new OpenQA.Selenium.Chrome.ChromeOptions();
  450. options.AddUserProfilePreference("profile.default_content_settings.popups", 0);
  451. options.AddUserProfilePreference("profile.default_content_setting_values.automatic_downloads", 1);
  452. options.AddUserProfilePreference("download.prompt_for_download", false); // 禁止下载提示
  453. options.AddUserProfilePreference("download.default_directory", strFileSavePath);
  454. options.AddUserProfilePreference("intl.accept_languages", "nl");
  455. options.AddUserProfilePreference("disable-popup-blocking", "true");
  456. options.AddUserProfilePreference("safebrowsing.enabled", true);
  457. options.AddArgument($"--unsafely-treat-insecure-origin-as-secure={ConfigHelper.GetSectionValue("IPEasySetting:IPEasyWeb").Replace("/Login.aspx", "")}");//替换自己的域名,多域名可用逗号分隔。
  458. if (isheadless)
  459. {
  460. options.AddArgument("headless");
  461. }
  462. var driver = new OpenQA.Selenium.Chrome.ChromeDriver(ConfigHelper.GetSectionValue("IPEasySetting:ChormeDriverPath"), options);
  463. driver.Manage().Window.Maximize();
  464. driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(50);
  465. driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(100);
  466. return driver;
  467. }
  468. /// <summary>
  469. /// 根据报表名称导出报表
  470. /// </summary>
  471. /// <param name="ReportName">报告名称</param>
  472. /// <param name="isModifyDate">是否手动修改日期范围</param>
  473. public static DataTable DownloadReport(string ReportName,bool isModifyDate)
  474. {
  475. Log($"{DateTime.Now}\t开始下载:{ReportName}");
  476. DataTable retDatatable;
  477. Log($"{DateTime.Now}\t开始启动Chrome");
  478. using (IWebDriver driver = CreateChromeDriver())
  479. {
  480. try
  481. {
  482. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
  483. Login(driver, wait);
  484. //点击顶部菜单栏中的报表管理菜单
  485. Log($"{DateTime.Now}\t点击顶部菜单栏中的报表管理菜单");
  486. var reportMenu = waitGetElementByName(wait, "970d33d5-c728-41b8-a060-4330610706b9");
  487. //driver.FindElement(By.Name("970d33d5-c728-41b8-a060-4330610706b9"));
  488. driver.ExecuteJavaScript("arguments[0].click();", reportMenu);
  489. //点击左侧 自定义报表 菜单
  490. Log($"{DateTime.Now}\t点击左侧 自定义报表 菜单");
  491. var customerReportMenu = waitGetElementByName(wait, "642fa96f-1e1f-46fd-aaa4-cb461ee8df5b");
  492. driver.ExecuteJavaScript("arguments[0].click();", customerReportMenu);
  493. //切换到自定义报表Frame
  494. Log($"{DateTime.Now}\t切换到自定义报表Frame");
  495. driver.SwitchTo().Frame(1);
  496. Log($"{DateTime.Now}\t开始搜索报告");
  497. var inputSearch = waitGetElementById(wait,"customizedList_TxtSheetSearchKey");
  498. Log($"{DateTime.Now}\t在搜索框中输入报告名称");
  499. inputSearch.SendKeys(ReportName);
  500. Log($"{DateTime.Now}\t点击搜索按钮");
  501. var btnSearch = waitGetElementByClassName(wait,"btn-search");
  502. btnSearch.Click();
  503. Log($"{DateTime.Now}\t选中报告");
  504. var reportRecord = wait.Until((d) =>
  505. {
  506. try
  507. {
  508. return d.FindElement(By.XPath($"//td[contains(text(),'{ReportName}')]"));
  509. }
  510. catch
  511. {
  512. return null;
  513. }
  514. });
  515. reportRecord.Click();
  516. if (isModifyDate)
  517. {
  518. Log($"{DateTime.Now}\t点击编辑");
  519. var btnEdit = waitGetElementByClassName(wait,"edit");
  520. btnEdit.Click();
  521. Log($"{DateTime.Now}\t清除以选择的处理事项完成日条件");
  522. try
  523. {
  524. var doItemFinished = wait.Until((d) => {
  525. return d.FindElement(By.XPath("//span[contains(@objcvalue,'_date') and contains(@id,'ST;')]"));
  526. });
  527. doItemFinished.Click();
  528. }
  529. catch { }
  530. Log($"{DateTime.Now}\t输入处理事项完成日期:开始日期");
  531. var startDate = wait.Until((d) => {
  532. return d.FindElement(By.XPath("//input[contains(@id,'dt_s_')]"));
  533. });
  534. startDate.Click();
  535. startDate.SendKeys(new DateTime(DateTime.Now.AddMonths(-1).Year, DateTime.Now.AddMonths(-1).Month, 1).ToString("yyyy-MM-dd"));
  536. Log($"{DateTime.Now}\t输入处理事项完成日期:结束日期");
  537. var endDate = wait.Until((d) =>
  538. {
  539. try
  540. {
  541. return d.FindElement(By.XPath("//input[contains(@id,'dt_e_')]"));//.Id("dt_e_4F8FE88D-9040-45F1-9723-45699BCD4CAF"));
  542. }
  543. catch
  544. {
  545. return null;
  546. }
  547. });
  548. endDate.Click();
  549. endDate.SendKeys(new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddDays(-1).ToString("yyyy-MM-dd"));
  550. Log($"{DateTime.Now}\t添加处理事项检索条件");
  551. var addDate = wait.Until((d) =>
  552. {
  553. try
  554. {
  555. return d.FindElement(By.XPath("//a[contains(@onclick,'ReportSub.ConditionDTSelect')]"));
  556. }
  557. catch
  558. {
  559. return null;
  560. }
  561. });
  562. addDate.Click();
  563. //System.Threading.Thread.Sleep(500);
  564. Log($"{DateTime.Now}\t保存检索条件");
  565. var btnSave = waitGetElementById(wait, "save"); // driver.FindElement(By.Id("save"));
  566. btnSave.Click();
  567. //System.Threading.Thread.Sleep(3000);
  568. }
  569. Log($"{DateTime.Now}\t点击导出Excel链接");
  570. var linkExport = wait.Until((d) =>
  571. {
  572. try
  573. {
  574. return d.FindElement(By.XPath("//a[contains(@onclick,'-') and @class='tbexcel']"));
  575. }
  576. catch
  577. {
  578. return null;
  579. }
  580. });
  581. linkExport.Click();
  582. //切换到弹出的导出报表窗口,点击导出按钮
  583. Log($"{DateTime.Now}\t切换到弹出的导出报表窗口,点击导出按钮");
  584. driver.SwitchTo().DefaultContent();
  585. var ihg_export = driver.FindElement(By.Name("ihg_export"));
  586. driver.SwitchTo().Frame(ihg_export);
  587. waitGetElementById(wait, "btnSubmit").Click();
  588. //切换到弹出的下载报表界面,点击下载按钮
  589. Log($"{DateTime.Now}\t切换到弹出的下载报表界面,点击下载按钮");
  590. //System.Threading.Thread.Sleep(3000);
  591. driver.SwitchTo().DefaultContent();
  592. var frameDownload = waitGetElementByName(wait,"DownloadList");
  593. driver.SwitchTo().Frame(frameDownload);
  594. var firstTr = waitGetElementByTagName(wait,"tr");
  595. var tdStatus = firstTr.FindElement(By.XPath(".//td")).FindElement(By.XPath("following-sibling::td[4]"));
  596. string strStatus = tdStatus.Text;
  597. while (strStatus.Trim() != "导出成功!")
  598. {
  599. if (strStatus.Trim() == "导出失败,请稍后重试!")
  600. {
  601. return null;
  602. }
  603. System.Threading.Thread.Sleep(5000);
  604. firstTr = waitGetElementByTagName(wait, "tr");
  605. tdStatus = firstTr.FindElement(By.XPath(".//td")).FindElement(By.XPath("following-sibling::td[4]"));
  606. strStatus = tdStatus.Text;
  607. }
  608. Log($"{DateTime.Now}\t点击下载按钮下载文档");
  609. firstTr = waitGetElementByTagName(wait, "tr");
  610. firstTr.FindElement(By.XPath(".//td/a[@title='下载']")).Click();
  611. //System.Threading.Thread.Sleep(5000);
  612. //btnDownload.Click();
  613. string strFilePath = System.IO.Path.Combine(strFileSavePath, $"{ReportName.Trim()}.xlsx");
  614. WaitForFileDownload(strFileSavePath, $"{ReportName.Trim()}.xlsx", TimeSpan.FromMinutes(5));
  615. //删除下载记录
  616. Log($"{DateTime.Now}\t删除下载记录");
  617. firstTr = waitGetElementByTagName(wait, "tr");// driver.FindElement(By.TagName("tr"));
  618. firstTr.FindElement(By.XPath(".//td/a[@title='删除']")).Click();
  619. //System.IO.FileInfo file = new System.IO.FileInfo(strFilePath.Replace("~", "_"));
  620. retDatatable = NPOIExcel.ExcelToDataTable(strFilePath.Replace("~", "_"), true);
  621. System.IO.File.Delete(strFilePath.Replace("~", "_"));
  622. }
  623. catch (Exception ex)
  624. {
  625. Log(ex.ToString());
  626. throw new Exception(ex.Message, ex);
  627. }
  628. finally
  629. {
  630. Log("关闭Chrome");
  631. driver.Quit();
  632. driver.Dispose();
  633. killChromProcess();
  634. }
  635. }
  636. Log($"{DateTime.Now}\t返回数据");
  637. return retDatatable;
  638. }
  639. /// <summary>
  640. /// 获取案件基本信息
  641. /// </summary>
  642. /// <param name="caseNo">我方文号</param>
  643. /// <returns></returns>
  644. public static dynamic GetCaseInfo(string caseNo)
  645. {
  646. dynamic retObject = new ExpandoObject();
  647. retObject.CaseNo = caseNo.Trim();
  648. using (IWebDriver driver = CreateChromeDriver())
  649. {
  650. try
  651. {
  652. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
  653. Login(driver, wait);
  654. //点击顶部菜单栏中的案件管理菜单
  655. waitGetElementByName(wait, "71A7CC35-F597-40E1-9FEF-BE622A3A3B63").Click();
  656. //点击左侧 查询 菜单
  657. waitGetElementByName(wait, "c3266ab3-521a-4815-8aaf-7dd0bc5a76af").Click();
  658. //切换到自定义报表Frame
  659. driver.SwitchTo().Frame(1);
  660. var inputSearch = waitGetElementById(wait,"case_volume");
  661. inputSearch.SendKeys(caseNo.Trim());
  662. var btnSearch = waitGetElementById(wait, "btn_Search");
  663. btnSearch.Click();
  664. var caseLink = wait.Until((d) => {
  665. return d.FindElement(By.XPath($"//a[contains(text(),'{caseNo}')]"));
  666. });
  667. caseLink.Click();
  668. driver.SwitchTo().ParentFrame().SwitchTo().Frame(2);
  669. //等待页面上ID属性值为submitButton的元素加载完成
  670. IWebElement myElement = wait.Until((d) =>
  671. {
  672. try
  673. {
  674. return d.FindElement(By.Id("libase"));
  675. }
  676. catch {
  677. return null;
  678. }
  679. });
  680. myElement.Click();
  681. //driver.FindElement(By.Id("libase")).Click();
  682. retObject.CaseName = driver.FindElement(By.Id("p_case_info__case_name")).GetAttribute("value"); //案件名称
  683. retObject.CustomerName = driver.FindElement(By.Id("p_case_info__customer_id")).GetAttribute("value"); //客户名称
  684. retObject.BusinessType = driver.FindElement(By.Id("p_case_info__business_type_id")).GetAttribute("value"); //业务类型
  685. retObject.CaseState = GetSelectText(driver.FindElement(By.Id("p_case_info__case_status_id")));
  686. retObject.ApplicationType = GetSelectText(driver.FindElement(By.Id("p_case_info__apply_type_id")));
  687. retObject.CaseType = driver.FindElement(By.Id("p_case_info__case_type_id")).GetAttribute("value"); //案件类型
  688. retObject.EntrustingDate = driver.FindElement(By.Id("p_case_info__charge_date")).GetAttribute("value"); //委案日期
  689. retObject.CaseMemo = driver.FindElement(By.Id("p_case_info__remark")).GetAttribute("value"); //案件备注
  690. driver.FindElement(By.XPath($"//span[contains(text(),'扩展信息')]")).Click();
  691. //select[@id='p_case_info__case_coefficient_id']
  692. retObject.CaseCoefficient = GetSelectText(driver.FindElement(By.Id("p_case_info__case_coefficient_id")));
  693. }
  694. catch (Exception ex)
  695. {
  696. throw new Exception(ex.Message, ex);
  697. }
  698. finally
  699. {
  700. driver.Quit();
  701. killChromProcess();
  702. }
  703. }
  704. return retObject;
  705. }
  706. public static dynamic GetPerformanceRecord(string caseNo, List<string> doItemNames)
  707. {
  708. dynamic retObject = new ExpandoObject();
  709. retObject.CaseNo = caseNo.Trim();
  710. using (var Service = ChromeDriverService.CreateDefaultService(ConfigHelper.GetSectionValue("IPEasySetting:ChormeDriverPath")))
  711. {
  712. Service.Start();
  713. using (IWebDriver driver = CreateChromeDriver())
  714. {
  715. try
  716. {
  717. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
  718. Login(driver,wait);
  719. //点击顶部菜单栏中的案件管理菜单
  720. waitGetElementByName(wait,"71A7CC35-F597-40E1-9FEF-BE622A3A3B63").Click();
  721. //点击左侧 查询 菜单
  722. waitGetElementByName(wait, "c3266ab3-521a-4815-8aaf-7dd0bc5a76af").Click();
  723. driver.SwitchTo().Frame(1);
  724. var inputSearch = wait.Until((d) =>
  725. {
  726. try
  727. {
  728. //切换到自定义报表Frame
  729. return d.FindElement(By.Id("case_volume"));
  730. }
  731. catch
  732. {
  733. return null;
  734. }
  735. });
  736. inputSearch.SendKeys(caseNo.Trim());
  737. var btnSearch = waitGetElementById(wait,"btn_Search");
  738. btnSearch.Click();
  739. var caseLink = wait.Until((d) =>
  740. {
  741. try
  742. {
  743. return d.FindElement(By.XPath($"//a[normalize-space()='{caseNo.Trim()}']"));
  744. }
  745. catch
  746. {
  747. return null;
  748. }
  749. });
  750. caseLink = driver.FindElement(By.XPath($"//a[normalize-space()='{caseNo.Trim()}']"));
  751. caseLink.Click();
  752. driver.SwitchTo().ParentFrame().SwitchTo().Frame(2);
  753. IWebElement temDoItemLink = null;
  754. string temFinishedDate = "";
  755. foreach (string doItemName in doItemNames)
  756. {
  757. var DoItemLinks = wait.Until((d) =>
  758. {
  759. return d.FindElements(By.XPath($"//td[@colname='ctrl_proc'][normalize-space()='{doItemName}']"));
  760. });
  761. if (DoItemLinks.Count > 0)
  762. {
  763. var DoItemLink = DoItemLinks[DoItemLinks.Count - 1];
  764. if (string.IsNullOrEmpty(temFinishedDate))
  765. {
  766. temFinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text;
  767. temDoItemLink = DoItemLink;
  768. }
  769. else
  770. {
  771. if (DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text.CompareTo(temFinishedDate) > 0)
  772. {
  773. temFinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text;
  774. temDoItemLink = DoItemLink;
  775. }
  776. }
  777. }
  778. }
  779. if(temDoItemLink != null)
  780. {
  781. retObject.CaseStage = temDoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //案件阶段
  782. retObject.DoItemState = temDoItemLink.FindElement(By.XPath("following-sibling::td[2]")).Text; //处理事项处理状态
  783. retObject.InternalDate = temDoItemLink.FindElement(By.XPath("following-sibling::td[4]")).Text; //内部期限
  784. retObject.CustomerLimitDate = temDoItemLink.FindElement(By.XPath("following-sibling::td[5]")).Text; //客户期限
  785. retObject.FinishedDate = temDoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text; //处理事项完成日
  786. retObject.DoPersons = temDoItemLink.FindElement(By.XPath("following-sibling::td[8]")).Text; //处理人
  787. retObject.DoItemMemo = temDoItemLink.FindElement(By.XPath("following-sibling::td[9]")).Text; //处理事项备注
  788. retObject.Reviewer = temDoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //核稿人
  789. retObject.DoItem = temDoItemLink.Text;
  790. //temDoItemLink = DoItemLink;
  791. temDoItemLink.Click();
  792. }
  793. else
  794. {
  795. throw new ApplicationException("处理事项不存在!");
  796. }
  797. var p_proc_finish_doc_date = wait.Until((d) =>
  798. {
  799. try
  800. {
  801. return d.FindElement(By.Id("p_proc_info__finish_doc_date"));
  802. }
  803. catch
  804. {
  805. return null;
  806. }
  807. });
  808. //System.Threading.Thread.Sleep(500);
  809. retObject.FinalizationDate = p_proc_finish_doc_date.GetAttribute("value"); //定稿日
  810. retObject.ReturnDate = driver.FindElement(By.Id("p_proc_info__back_date")).GetAttribute("value"); //返稿日
  811. retObject.Reviewer = driver.FindElement(By.Id("p_proc_info__revise_user")).GetAttribute("value"); //核稿人
  812. retObject.DoItemCoefficient = driver.FindElement(By.Id("p_proc_info__proc_coefficient")).GetAttribute("value"); //处理事项系数
  813. retObject.WordCount = driver.FindElement(By.Id("p_proc_info__translate_count")).GetAttribute("value"); //翻译字数
  814. driver.FindElement(By.Id("libase")).Click();
  815. var p_case_info__case_name = wait.Until((d) =>
  816. {
  817. try
  818. {
  819. return d.FindElement(By.Id("p_case_info__case_name"));
  820. }
  821. catch
  822. {
  823. return null;
  824. }
  825. });
  826. retObject.CaseName = p_case_info__case_name.GetAttribute("value"); //案件名称
  827. retObject.CustomerName = driver.FindElement(By.Id("p_case_info__customer_id")).GetAttribute("value"); //客户名称
  828. retObject.BusinessType = driver.FindElement(By.Id("p_case_info__business_type_id")).GetAttribute("value"); //业务类型
  829. retObject.CaseState = GetSelectText(driver.FindElement(By.Id("p_case_info__case_status_id")));
  830. retObject.ApplicationType = GetSelectText(driver.FindElement(By.Id("p_case_info__apply_type_id")));
  831. retObject.CaseType = driver.FindElement(By.Id("p_case_info__case_type_id")).GetAttribute("value"); //案件类型
  832. retObject.EntrustingDate = driver.FindElement(By.Id("p_case_info__charge_date")).GetAttribute("value"); //委案日期
  833. retObject.CaseMemo = driver.FindElement(By.Id("p_case_info__remark")).GetAttribute("value"); //案件备注
  834. driver.FindElement(By.XPath($"//span[contains(text(),'扩展信息')]")).Click();
  835. //select[@id='p_case_info__case_coefficient_id']
  836. retObject.CaseCoefficient = GetSelectText(driver.FindElement(By.Id("p_case_info__case_coefficient_id")));
  837. }
  838. catch (Exception ex)
  839. {
  840. throw new Exception(ex.Message, ex);
  841. }
  842. finally
  843. {
  844. driver.Quit();
  845. killChromProcess();
  846. }
  847. }
  848. Service.Dispose();
  849. }
  850. return retObject;
  851. }
  852. /// <summary>
  853. /// 获取案件处理事项记录
  854. /// </summary>
  855. /// <param name="caseNo">我方文号</param>
  856. /// <param name="doItemName">处理事项</param>
  857. /// <returns></returns>
  858. public static dynamic GetPerformanceRecord(string caseNo,string doItemName,string caseStage=null)
  859. {
  860. if (caseNo.StartsWith("APCN"))
  861. {
  862. //商标
  863. return GetAPCNPerformanceRecord(caseNo, doItemName, caseStage);
  864. }
  865. dynamic retObject = new ExpandoObject();
  866. retObject.CaseNo = caseNo.Trim();
  867. retObject.DoItem = doItemName;
  868. using (var Service = ChromeDriverService.CreateDefaultService(ConfigHelper.GetSectionValue("IPEasySetting:ChormeDriverPath")))
  869. {
  870. Service.Start();
  871. using (IWebDriver driver = CreateChromeDriver())
  872. {
  873. try
  874. {
  875. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
  876. Login(driver, wait);
  877. //点击顶部菜单栏中的案件管理菜单
  878. waitGetElementByName(wait,"71A7CC35-F597-40E1-9FEF-BE622A3A3B63").Click();
  879. //点击左侧 查询 菜单
  880. waitGetElementByName(wait, "c3266ab3-521a-4815-8aaf-7dd0bc5a76af").Click();
  881. driver.SwitchTo().Frame(1);
  882. var inputSearch = wait.Until((d) =>
  883. {
  884. try
  885. {
  886. return d.FindElement(By.Id("case_volume"));
  887. }
  888. catch
  889. {
  890. return null;
  891. }
  892. });
  893. inputSearch.SendKeys(caseNo.Trim());
  894. var btnSearch = waitGetElementById(wait,"btn_Search");
  895. btnSearch.Click();
  896. var caseLink = wait.Until((d) =>
  897. {
  898. try
  899. {
  900. return d.FindElement(By.XPath($"//a[normalize-space()='{caseNo.Trim()}']"));
  901. }
  902. catch
  903. {
  904. return null;
  905. }
  906. });
  907. caseLink.Click();
  908. driver.SwitchTo().ParentFrame().SwitchTo().Frame(2);
  909. var DoItemLinks = wait.Until((d) => {
  910. return d.FindElements(By.XPath($"//td[@colname='ctrl_proc'][normalize-space()='{doItemName}']"));
  911. });
  912. if (DoItemLinks.Count > 0)
  913. {
  914. if (!string.IsNullOrEmpty(caseStage))
  915. {
  916. foreach (var DoItemLink in DoItemLinks)
  917. {
  918. var temCaseStage = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text;
  919. if (temCaseStage == caseStage)
  920. {
  921. retObject.CaseStage = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //案件阶段
  922. retObject.DoItemState = DoItemLink.FindElement(By.XPath("following-sibling::td[2]")).Text; //处理事项处理状态
  923. retObject.InternalDate = DoItemLink.FindElement(By.XPath("following-sibling::td[4]")).Text; //内部期限
  924. retObject.CustomerLimitDate = DoItemLink.FindElement(By.XPath("following-sibling::td[5]")).Text; //客户期限
  925. retObject.FinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text; //处理事项完成日
  926. retObject.DoPersons = DoItemLink.FindElement(By.XPath("following-sibling::td[8]")).Text; //处理人
  927. retObject.DoItemMemo = DoItemLink.FindElement(By.XPath("following-sibling::td[9]")).Text; //处理事项备注
  928. retObject.Reviewer = DoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //核稿人
  929. DoItemLink.Click();
  930. break;
  931. }
  932. }
  933. }
  934. else
  935. {
  936. var DoItemLink = DoItemLinks[DoItemLinks.Count - 1];
  937. retObject.CaseStage = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //案件阶段
  938. retObject.DoItemState = DoItemLink.FindElement(By.XPath("following-sibling::td[2]")).Text; //处理事项处理状态
  939. retObject.InternalDate = DoItemLink.FindElement(By.XPath("following-sibling::td[4]")).Text; //内部期限
  940. retObject.CustomerLimitDate = DoItemLink.FindElement(By.XPath("following-sibling::td[5]")).Text; //客户期限
  941. retObject.FinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text; //处理事项完成日
  942. retObject.DoPersons = DoItemLink.FindElement(By.XPath("following-sibling::td[8]")).Text; //处理人
  943. retObject.DoItemMemo = DoItemLink.FindElement(By.XPath("following-sibling::td[9]")).Text; //处理事项备注
  944. retObject.Reviewer = DoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //核稿人
  945. DoItemLink.Click();
  946. }
  947. }
  948. var p_proc_finish_doc_date = wait.Until((d) =>
  949. {
  950. try
  951. {
  952. return d.FindElement(By.Id("p_proc_info__finish_doc_date"));
  953. }
  954. catch
  955. {
  956. return null;
  957. }
  958. });
  959. retObject.FinalizationDate = p_proc_finish_doc_date.GetAttribute("value"); //定稿日
  960. retObject.ReturnDate = driver.FindElement(By.Id("p_proc_info__back_date")).GetAttribute("value"); //返稿日
  961. retObject.Reviewer = driver.FindElement(By.Id("p_proc_info__revise_user")).GetAttribute("value"); //核稿人
  962. retObject.DoItemCoefficient = driver.FindElement(By.Id("p_proc_info__proc_coefficient")).GetAttribute("value"); //处理事项系数
  963. retObject.WordCount = driver.FindElement(By.Id("p_proc_info__translate_count")).GetAttribute("value"); //翻译字数
  964. waitGetElementById(wait, "libase").Click();
  965. var p_case_info__case_name = wait.Until((d) =>
  966. {
  967. try
  968. {
  969. return d.FindElement(By.Id("p_case_info__case_name"));
  970. }
  971. catch
  972. {
  973. return null;
  974. }
  975. });
  976. retObject.CaseName = p_case_info__case_name.GetAttribute("value"); //案件名称
  977. retObject.CustomerName = driver.FindElement(By.Id("p_case_info__customer_id")).GetAttribute("value"); //客户名称
  978. retObject.BusinessType = driver.FindElement(By.Id("p_case_info__business_type_id")).GetAttribute("value"); //业务类型
  979. retObject.CaseState = GetSelectText(driver.FindElement(By.Id("p_case_info__case_status_id")));
  980. retObject.ApplicationType = GetSelectText(driver.FindElement(By.Id("p_case_info__apply_type_id")));
  981. retObject.CaseType = driver.FindElement(By.Id("p_case_info__case_type_id")).GetAttribute("value"); //案件类型
  982. retObject.EntrustingDate = driver.FindElement(By.Id("p_case_info__charge_date")).GetAttribute("value"); //委案日期
  983. retObject.CaseMemo = driver.FindElement(By.Id("p_case_info__remark")).GetAttribute("value"); //案件备注
  984. driver.FindElement(By.XPath($"//span[contains(text(),'扩展信息')]")).Click();
  985. retObject.CaseCoefficient = GetSelectText(driver.FindElement(By.Id("p_case_info__case_coefficient_id")));
  986. }
  987. catch (Exception ex)
  988. {
  989. throw new Exception(ex.Message, ex);
  990. }
  991. finally
  992. {
  993. driver.Quit();
  994. killChromProcess();
  995. }
  996. }
  997. Service.Dispose();
  998. }
  999. return retObject;
  1000. }
  1001. private static dynamic GetAPCNPerformanceRecord(string caseNo, string doItemName, string caseStage = null)
  1002. {
  1003. dynamic retObject = new ExpandoObject();
  1004. retObject.CaseNo = caseNo.Trim();
  1005. retObject.DoItem = doItemName;
  1006. using (var Service = ChromeDriverService.CreateDefaultService(ConfigHelper.GetSectionValue("IPEasySetting:ChormeDriverPath")))
  1007. {
  1008. Service.Start();
  1009. using (IWebDriver driver = CreateChromeDriver())
  1010. {
  1011. try
  1012. {
  1013. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
  1014. Login(driver, wait);
  1015. //点击顶部菜单栏中的案件管理菜单
  1016. driver.FindElement(By.Name("71A7CC35-F597-40E1-9FEF-BE622A3A3B63")).Click();
  1017. System.Threading.Thread.Sleep(500);
  1018. //点击左侧 查询 菜单
  1019. driver.FindElement(By.Name("FF4E1FF9-FE36-4F0F-99DF-81E60817722E")).Click();
  1020. driver.SwitchTo().Frame(1);
  1021. var inputSearch = wait.Until((d) =>
  1022. {
  1023. try
  1024. {
  1025. //切换到自定义报表Frame
  1026. return d.FindElement(By.Id("case_volume"));
  1027. }
  1028. catch
  1029. {
  1030. return null;
  1031. }
  1032. });
  1033. inputSearch.SendKeys(caseNo.Trim());
  1034. var btnSearch = waitGetElementById(wait,"btn_Search");
  1035. btnSearch.Click();
  1036. var caseLink = wait.Until((d) =>
  1037. {
  1038. try
  1039. {
  1040. return d.FindElement(By.XPath($"//a[normalize-space()='{caseNo.Trim()}']"));
  1041. }
  1042. catch
  1043. {
  1044. return null;
  1045. }
  1046. });
  1047. caseLink.Click();
  1048. driver.SwitchTo().ParentFrame().SwitchTo().Frame(2);
  1049. var DoItemLinks = wait.Until((d) => {
  1050. return driver.FindElements(By.XPath($"//td[@colname='ctrl_proc'][normalize-space()='{doItemName}']"));
  1051. });
  1052. if (DoItemLinks.Count > 0)
  1053. {
  1054. if (!string.IsNullOrEmpty(caseStage))
  1055. {
  1056. foreach (var DoItemLink in DoItemLinks)
  1057. {
  1058. var temCaseStage = wait.Until((d) => {
  1059. return DoItemLink.FindElement(By.XPath("following-sibling::td[1]"));
  1060. }).Text;
  1061. if (temCaseStage == caseStage)
  1062. {
  1063. retObject.CaseStage = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //案件阶段
  1064. retObject.DoItemState = DoItemLink.FindElement(By.XPath("following-sibling::td[2]")).Text; //处理事项处理状态
  1065. retObject.InternalDate = DoItemLink.FindElement(By.XPath("following-sibling::td[4]")).Text; //内部期限
  1066. retObject.CustomerLimitDate = DoItemLink.FindElement(By.XPath("following-sibling::td[5]")).Text; //客户期限
  1067. retObject.FinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text; //处理事项完成日
  1068. retObject.DoPersons = DoItemLink.FindElement(By.XPath("following-sibling::td[8]")).Text; //处理人
  1069. retObject.DoItemMemo = DoItemLink.FindElement(By.XPath("following-sibling::td[9]")).Text; //处理事项备注
  1070. retObject.Reviewer = DoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //核稿人
  1071. DoItemLink.Click();
  1072. //driver.ExecuteJavaScript("$(arguments[0]).click()", DoItemLink);
  1073. break;
  1074. }
  1075. }
  1076. }
  1077. else
  1078. {
  1079. var DoItemLink = DoItemLinks[DoItemLinks.Count - 1];
  1080. //retObject.CaseStage = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //案件阶段
  1081. retObject.DoItemState = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //处理事项处理状态
  1082. retObject.InternalDate = DoItemLink.FindElement(By.XPath("following-sibling::td[3]")).Text; //内部期限
  1083. retObject.CustomerLimitDate = DoItemLink.FindElement(By.XPath("following-sibling::td[4]")).Text; //客户期限
  1084. retObject.FinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[6]")).Text; //处理事项完成日
  1085. retObject.DoPersons = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text; //处理人
  1086. retObject.DoItemMemo = DoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //处理事项备注
  1087. //retObject.Reviewer = DoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //核稿人
  1088. DoItemLink.Click();
  1089. //new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(DoItemLink)).Click();
  1090. }
  1091. }
  1092. var p_proc_finish_doc_date = wait.Until((d) =>
  1093. {
  1094. try
  1095. {
  1096. return d.FindElement(By.Id("p_proc_info__finish_doc_date"));
  1097. }
  1098. catch
  1099. {
  1100. return null;
  1101. }
  1102. });
  1103. //System.Threading.Thread.Sleep(500);
  1104. retObject.FinalizationDate = p_proc_finish_doc_date.GetAttribute("value"); //定稿日
  1105. retObject.ReturnDate = driver.FindElement(By.Id("p_proc_info__back_date")).GetAttribute("value"); //返稿日
  1106. retObject.Reviewer = driver.FindElement(By.Id("p_proc_info__revise_user")).GetAttribute("value"); //核稿人
  1107. retObject.DoItemCoefficient = driver.FindElement(By.Id("p_proc_info__proc_coefficient")).GetAttribute("value"); //处理事项系数
  1108. retObject.WordCount = driver.FindElement(By.Id("p_proc_info__translate_count")).GetAttribute("value"); //翻译字数
  1109. waitGetElementById(wait,"libase").Click();
  1110. var p_case_info__case_name = wait.Until((d) =>
  1111. {
  1112. try
  1113. {
  1114. return d.FindElement(By.Id("p_case_info__case_name"));
  1115. }
  1116. catch
  1117. {
  1118. return null;
  1119. }
  1120. });
  1121. //System.Threading.Thread.Sleep(500);
  1122. retObject.CaseName = p_case_info__case_name.GetAttribute("value"); //案件名称
  1123. retObject.CustomerName = driver.FindElement(By.Id("p_case_info__customer_id")).GetAttribute("value"); //客户名称
  1124. retObject.BusinessType = driver.FindElement(By.Id("p_case_info__business_type_id")).GetAttribute("value"); //业务类型
  1125. retObject.CaseState = GetSelectText(driver.FindElement(By.Id("p_case_info__case_status_id")));
  1126. retObject.ApplicationType = GetSelectText(driver.FindElement(By.Id("p_case_info__apply_type_id")));
  1127. retObject.CaseType = driver.FindElement(By.Id("p_case_info__case_type_id")).GetAttribute("value"); //案件类型
  1128. retObject.EntrustingDate = driver.FindElement(By.Id("p_case_info__charge_date")).GetAttribute("value"); //委案日期
  1129. retObject.CaseMemo = driver.FindElement(By.Id("p_case_info__remark")).GetAttribute("value"); //案件备注
  1130. //driver.FindElement(By.XPath($"//span[contains(text(),'扩展信息')]")).Click();
  1131. //select[@id='p_case_info__case_coefficient_id']
  1132. //retObject.CaseCoefficient = GetSelectText(driver.FindElement(By.Id("p_case_info__case_coefficient_id")));
  1133. }
  1134. catch (Exception ex)
  1135. {
  1136. throw new Exception(ex.Message, ex);
  1137. }
  1138. finally
  1139. {
  1140. driver.Quit();
  1141. killChromProcess();
  1142. }
  1143. }
  1144. Service.Dispose();
  1145. }
  1146. return retObject;
  1147. }
  1148. private static void killChromProcess()
  1149. {
  1150. try
  1151. {
  1152. Process[] workers = Process.GetProcessesByName("Chrome");
  1153. foreach (Process worker in workers)
  1154. {
  1155. worker.Kill();
  1156. worker.WaitForExit();
  1157. worker.Dispose();
  1158. }
  1159. workers = Process.GetProcessesByName("Chromedriver");
  1160. foreach (Process worker in workers)
  1161. {
  1162. worker.Kill();
  1163. worker.WaitForExit();
  1164. worker.Dispose();
  1165. }
  1166. }
  1167. catch { }
  1168. }
  1169. private static string GetSelectText(IWebElement element)
  1170. {
  1171. var strValue = element.GetAttribute("value");
  1172. if (string.IsNullOrEmpty(strValue))
  1173. {
  1174. return null;
  1175. }
  1176. var ops = element.FindElements(By.TagName("option"));
  1177. foreach (var op in ops)
  1178. {
  1179. if (op.GetAttribute("value") == strValue)
  1180. {
  1181. return op.Text;
  1182. }
  1183. }
  1184. return null;
  1185. }
  1186. }
  1187. }