IPEasyUtility.cs 91 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130
  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 OpenQA.Selenium;
  11. using OpenQA.Selenium.Chrome;
  12. using OpenQA.Selenium.Support.Extensions;
  13. using OpenQA.Selenium.Support.UI;
  14. namespace wispro.sp.utility
  15. {
  16. public class IPEasyUtility
  17. {
  18. static string strFileSavePath = ConfigHelper.GetSectionValue("IPEasySetting:DownloadFileSavePath");
  19. static string Account = ConfigHelper.GetSectionValue("IPEasySetting:Account");
  20. static string Password = ConfigHelper.GetSectionValue("IPEasySetting:Password");
  21. static string WaitForFileDownload(string downloadDir, TimeSpan timeout)
  22. {
  23. string fileName = null;
  24. DateTime startTime = DateTime.Now;
  25. while (DateTime.Now - startTime < timeout)
  26. {
  27. if (Directory.GetFiles(downloadDir).Length > 0)
  28. {
  29. fileName = Directory.GetFiles(downloadDir).FirstOrDefault();
  30. break;
  31. }
  32. Thread.Sleep(100);
  33. }
  34. while (File.Exists(fileName) && DateTime.Now - startTime < timeout)
  35. {
  36. // 检查文件是否完成写入(文件大小是否稳定)
  37. long previousSize = 0;
  38. long currentSize = new FileInfo(fileName).Length;
  39. while (previousSize != currentSize && currentSize > 0)
  40. {
  41. //Debug.WriteLine($"{fileName}文件大小:{previousSize},{currentSize}");
  42. previousSize = currentSize;
  43. try
  44. {
  45. //文件在下载完后,临时文件可能就不存在了,
  46. //这时会导致下边的语句会抛出错误
  47. currentSize = new FileInfo(fileName).Length;
  48. }
  49. catch (Exception ex)
  50. {
  51. Debug.WriteLine($"获取文件出错大小:{ex.Message}");
  52. break;
  53. }
  54. //Debug.WriteLine("等待一段时间!");
  55. //Debug.WriteLine($"{fileName}文件大小:{previousSize},{currentSize}");
  56. Thread.Sleep(3000); // 等待一段时间
  57. }
  58. if (previousSize == currentSize)
  59. {
  60. if ((fileName.Contains(".crdownload") || fileName.Contains(".tmp")) && File.Exists(fileName))
  61. {
  62. //Debug.WriteLine(".crdownload文件,等待!");
  63. Thread.Sleep(1000);
  64. }
  65. else
  66. {
  67. //Debug.WriteLine($"文件大小相同跳出循环");
  68. break;
  69. }
  70. }
  71. }
  72. fileName = Directory.GetFiles(downloadDir).FirstOrDefault();
  73. while ((fileName.Contains(".crdownload") || fileName.Contains(".tmp")) && !string.IsNullOrEmpty(fileName))
  74. {
  75. fileName = Directory.GetFiles(downloadDir).FirstOrDefault();
  76. Thread.Sleep(1000);
  77. }
  78. return Directory.GetFiles(downloadDir).FirstOrDefault();
  79. }
  80. static bool fileInFolder(string strFolder, string filename, out string outFilePath)
  81. {
  82. if (File.Exists(Path.Combine(strFolder, filename)))
  83. {
  84. outFilePath = Path.Combine(strFolder, filename);
  85. return true;
  86. }
  87. else
  88. {
  89. outFilePath = null;
  90. if (Directory.Exists(strFolder))
  91. {
  92. foreach (var f in new DirectoryInfo(strFolder).GetFiles())
  93. {
  94. string temName = f.Name.Trim();
  95. if (temName == filename || temName.Replace("\u00A0", "").Replace(" ", "") == filename.Replace("\u00A0", "").Replace(" ", ""))
  96. {
  97. outFilePath = f.FullName;
  98. return true;
  99. }
  100. }
  101. return false;
  102. }
  103. else
  104. {
  105. return false;
  106. }
  107. }
  108. }
  109. static bool WaitForFileDownload(string downloadDir, string fileName, TimeSpan timeout, out string outfile)
  110. {
  111. DateTime startTime = DateTime.Now;
  112. while (DateTime.Now - startTime < timeout)
  113. {
  114. string filePath = Path.Combine(downloadDir, fileName);
  115. if (fileInFolder(downloadDir, fileName, out filePath))
  116. {
  117. // 检查文件是否完成写入(文件大小是否稳定)
  118. long previousSize = 0;
  119. long currentSize = new FileInfo(filePath).Length;
  120. while (previousSize != currentSize)
  121. {
  122. Thread.Sleep(1000); // 等待一段时间
  123. previousSize = currentSize;
  124. currentSize = new FileInfo(filePath).Length;
  125. }
  126. outfile = filePath;
  127. return true; // 文件下载完成
  128. }
  129. Thread.Sleep(1000); // 等待文件出现
  130. }
  131. outfile = null;
  132. return false; // 超时,文件未下载完成
  133. }
  134. static IWebElement waitGetElementById(WebDriverWait wait, string id, IWebElement parentElement = null)
  135. {
  136. return wait.Until((d) =>
  137. {
  138. try
  139. {
  140. if (parentElement == null)
  141. {
  142. return d.FindElement(By.Id(id));
  143. }
  144. else
  145. {
  146. return parentElement.FindElement(By.Id(id));
  147. }
  148. }
  149. catch
  150. {
  151. return null;
  152. }
  153. });
  154. }
  155. static IWebElement waitGetElementByName(WebDriverWait wait, string name, IWebElement parentElement = null)
  156. {
  157. return wait.Until((d) =>
  158. {
  159. try
  160. {
  161. if (parentElement == null)
  162. {
  163. return d.FindElement(By.Name(name));
  164. }
  165. else
  166. {
  167. return parentElement.FindElement(By.Name(name));
  168. }
  169. }
  170. catch
  171. {
  172. return null;
  173. }
  174. });
  175. }
  176. static IWebElement waitGetElementByTagName(WebDriverWait wait, string name, IWebElement parentElement = null)
  177. {
  178. return wait.Until((d) =>
  179. {
  180. try
  181. {
  182. if (parentElement == null)
  183. {
  184. return d.FindElement(By.TagName(name));
  185. }
  186. else
  187. {
  188. return parentElement.FindElement(By.TagName(name));
  189. }
  190. }
  191. catch
  192. {
  193. return null;
  194. }
  195. });
  196. }
  197. static ReadOnlyCollection<IWebElement> waitGetElementsByName(WebDriverWait wait, string name, IWebElement parentElement = null)
  198. {
  199. return wait.Until((d) =>
  200. {
  201. try
  202. {
  203. if (parentElement == null)
  204. {
  205. return d.FindElements(By.Name(name));
  206. }
  207. else
  208. {
  209. return parentElement.FindElements(By.Name(name));
  210. }
  211. }
  212. catch
  213. {
  214. return null;
  215. }
  216. });
  217. }
  218. static ReadOnlyCollection<IWebElement> waitGetElementsByTagName(WebDriverWait wait, string name, IWebElement parentElement = null)
  219. {
  220. return wait.Until((d) =>
  221. {
  222. try
  223. {
  224. if (parentElement == null)
  225. {
  226. return d.FindElements(By.TagName(name));
  227. }
  228. else
  229. {
  230. return parentElement.FindElements(By.TagName(name));
  231. }
  232. }
  233. catch
  234. {
  235. return null;
  236. }
  237. });
  238. }
  239. static IWebElement waitGetElementByClassName(WebDriverWait wait, string name, IWebElement parentElement = null)
  240. {
  241. return wait.Until((d) =>
  242. {
  243. try
  244. {
  245. if (parentElement == null)
  246. {
  247. return d.FindElement(By.ClassName(name));
  248. }
  249. else
  250. {
  251. return parentElement.FindElement(By.ClassName(name));
  252. }
  253. }
  254. catch
  255. {
  256. return null;
  257. }
  258. });
  259. }
  260. private static string CopyFile(string strfile)
  261. {
  262. if (strfile == null)
  263. {
  264. return null;
  265. }
  266. string fileName = new FileInfo(strfile).Name;
  267. string desfile = Path.Combine(strFileSavePath, fileName);
  268. if (File.Exists(desfile))
  269. {
  270. File.Delete(desfile);
  271. }
  272. File.Copy(strfile, desfile);
  273. File.Delete(strfile);
  274. return desfile;
  275. }
  276. /// <summary>
  277. /// 获取指定案号的专利申请案的基本信息和初稿文件、定稿文件和第一次返稿文件
  278. /// </summary>
  279. /// <param name="caseNo"></param>
  280. /// <returns></returns>
  281. /// <exception cref="Exception"></exception>
  282. public static dynamic DownloadCaseFiles(string caseNo)
  283. {
  284. dynamic retObject = new ExpandoObject();
  285. string[] splitCase = caseNo.Split(new[] { '-' });
  286. if (splitCase.Length > 1)
  287. {
  288. string temCaseNo = "";
  289. for (int i = 0; i < splitCase.Length - 1; i++)
  290. {
  291. temCaseNo = string.IsNullOrEmpty(temCaseNo) ? splitCase[i] : $"{temCaseNo}-{splitCase[i]}";
  292. }
  293. caseNo = temCaseNo.Trim();
  294. }
  295. retObject.CaseNo = caseNo.Trim();
  296. string strDownloadPath = Path.Combine(strFileSavePath, caseNo);
  297. if (!Directory.Exists(strDownloadPath))
  298. {
  299. Directory.CreateDirectory(strDownloadPath);
  300. }
  301. using (IWebDriver driver = CreateChromeDriver(strDownloadPath))
  302. {
  303. try
  304. {
  305. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));
  306. Login(driver, wait);
  307. //点击顶部菜单栏中的案件管理菜单
  308. IWebElement linkCaseManager = waitGetElementByName(wait, "71A7CC35-F597-40E1-9FEF-BE622A3A3B63");
  309. linkCaseManager.Click();
  310. IWebElement linkCaseSearch = wait.Until((d) =>
  311. {
  312. try
  313. {
  314. return driver.FindElement(By.LinkText("案件查询"));
  315. }
  316. catch
  317. {
  318. return null;
  319. }
  320. });
  321. driver.ExecuteJavaScript("arguments[0].click();", linkCaseSearch);
  322. //linkCaseSearch.Click();
  323. IWebElement patentSearch = waitGetElementByName(wait, "4df7eee3-426f-4ce5-9204-34ccb0fd27f7");
  324. driver.ExecuteJavaScript("arguments[0].click();", patentSearch);
  325. //patentSearch.Click();
  326. driver.SwitchTo().Frame(1);
  327. var inputSearch = waitGetElementById(wait, "case_volume");//driver.FindElement(By.Id("case_volume"));
  328. inputSearch.SendKeys(caseNo.Trim());
  329. var btnSearch = waitGetElementById(wait, "btn_Search");// driver.FindElement(By.Id("btn_Search"));
  330. System.Threading.Thread.Sleep(200);
  331. driver.ExecuteJavaScript("arguments[0].click();", btnSearch);
  332. //btnSearch.Click();
  333. //System.Threading.Thread.Sleep(500);
  334. try
  335. {
  336. var caseLink = wait.Until((d) =>
  337. {
  338. try
  339. {
  340. return d.FindElement(By.XPath($"//a[contains(text(),'{caseNo}')]"));
  341. }
  342. catch
  343. {
  344. return null;
  345. }
  346. });
  347. driver.ExecuteJavaScript("arguments[0].click();", caseLink);
  348. }
  349. catch (Exception ex)
  350. {
  351. throw;
  352. if (ex.Message.Contains("no such element: Unable to locate element"))
  353. {
  354. return retObject;
  355. }
  356. }
  357. System.Threading.Thread.Sleep(1000);
  358. driver.SwitchTo().ParentFrame();
  359. driver.SwitchTo().Frame(2);
  360. //案件名称
  361. retObject.CaseName = waitGetElementById(wait, "p_case_info__case_name").GetAttribute("value");
  362. //我方文号
  363. retObject.CaseNo = waitGetElementById(wait, "p_case_info__case_volume").GetAttribute("value");
  364. //案件类型
  365. retObject.CaseType = waitGetElementById(wait, "p_case_info__case_type_id").GetAttribute("value");
  366. //申请类型
  367. var selectElement = waitGetElementById(wait, "p_case_info__apply_type_id");
  368. retObject.ApplicationType = new SelectElement(selectElement).SelectedOption.Text;
  369. //客户
  370. retObject.Customer = waitGetElementById(wait, "p_case_info__customer_id").GetAttribute("value").Replace("(null)", "");
  371. //申请国家
  372. retObject.Country = waitGetElementById(wait, "p_case_info__country_id").GetAttribute("value");
  373. #region 下载新申请第一次返稿文档
  374. retObject.firstReturnFile = null;
  375. var kzTab = wait.Until(d => d.FindElement(By.XPath($"//span[contains(text(),'往来信息')]")));
  376. kzTab.Click();
  377. var kzTable = waitGetElementById(wait, "table_SendList");
  378. System.Threading.Thread.Sleep(500);
  379. var retRows = GetWeidijiaoFile(driver, wait, kzTable);
  380. foreach (var row in retRows)
  381. {
  382. var btnDownload = waitGetElementByClassName(wait, "tbview", row[row.Count - 1]);
  383. driver.ExecuteJavaScript("arguments[0].click();", btnDownload);
  384. driver.SwitchTo().DefaultContent()
  385. .SwitchTo().Frame(3);
  386. System.Threading.Thread.Sleep(1000);
  387. var attachTable = wait.Until(d => d.FindElement(By.Id($"table_mailfile")));
  388. System.Threading.Thread.Sleep(1000);
  389. retObject.firstReturnFile = Download(driver, wait, attachTable, new { fileNameCol = 2, fileTypeCol = -1, uploadDateCol = 6 }, "新申请第一次返稿", strDownloadPath, new string[] { "申请文件", "申请文档", "说明书" }, new string[] { "检索报告", "查新报告", "交底书", "对比文件", "图档" });
  390. driver.SwitchTo().ParentFrame();
  391. var closer = wait.Until((d) => { return driver.FindElement(By.XPath("//li[@class=\"active\"]/div[@title=\"关闭\"]")); });
  392. closer.Click();
  393. driver.SwitchTo().Frame(2);
  394. if (retObject.firstReturnFile != null)
  395. {
  396. retObject.firstReturnFile = CopyFile(retObject.firstReturnFile);
  397. break;
  398. }
  399. }
  400. if (retRows.Count > 0 && retObject.firstReturnFile == null)
  401. {
  402. throw new Exception("未抓取到第一次返稿文件!");
  403. }
  404. #endregion
  405. var table = waitGetElementById(wait, "table_ProcList");
  406. var rows = waitGetElementsByTagName(wait, "tr", table);// table.FindElements(By.TagName("tr"));
  407. foreach (var row in rows)
  408. {
  409. var cells = row.FindElements(By.TagName("td"));
  410. if (cells[1].Text == "新申请")
  411. {
  412. var bthEdit = waitGetElementByClassName(wait, "tbedit", cells[12]);
  413. driver.ExecuteJavaScript("arguments[0].click();", bthEdit);
  414. break;
  415. }
  416. }
  417. driver.SwitchTo().ParentFrame().SwitchTo().Frame(0);
  418. //案件阶段
  419. var caseStage = waitGetElementById(wait, "select2-p_proc_info__review_stage-container");
  420. if (caseStage != null && caseStage.Text != "--请选择--")
  421. {
  422. retObject.CaseStage = caseStage.Text;
  423. }
  424. //内部期限
  425. retObject.InternalDate = waitGetElementById(wait, "p_proc_info__int_due_date").GetAttribute("value");
  426. //处理事项系数
  427. var DICoe = waitGetElementById(wait, "p_proc_info__proc_coefficient_id");
  428. retObject.DoItemCoefficient = new SelectElement(DICoe).SelectedOption.Text;
  429. if (retObject.DoItemCoefficient == "请选择")
  430. {
  431. retObject.DoItemCoefficient = "";
  432. }
  433. retObject.DoPersons = waitGetElementById(wait, "pic_list").GetAttribute("value"); //处理人
  434. retObject.Reviewer = waitGetElementById(wait, "rev_list").GetAttribute("value").Replace(";", ""); //核稿人
  435. //第一次初稿日
  436. retObject.FirstDraftDate = waitGetElementById(wait, "p_proc_info__first_doc_date").GetAttribute("value");
  437. //客户期限
  438. retObject.CustomerLimitDate = waitGetElementById(wait, "p_proc_info__cus_due_date").GetAttribute("value");
  439. //配案日
  440. retObject.CaseAssigmentDate = waitGetElementById(wait, "p_proc_info__allocate_date").GetAttribute("value");
  441. //返稿日
  442. retObject.ReturnDate = waitGetElementById(wait, "p_proc_info__back_date").GetAttribute("value");
  443. //定稿日
  444. retObject.FinalizationDate = waitGetElementById(wait, "p_proc_info__finish_doc_date").GetAttribute("value");
  445. retObject.FinishedDate = waitGetElementById(wait, "p_proc_info__finish_date").GetAttribute("value");
  446. //点击附件信息Tab
  447. var lifile = driver.FindElement(By.Id("lifile"));
  448. driver.ExecuteJavaScript("arguments[0].click();", lifile);
  449. //添加从文件清单中获取
  450. //“新申请第一次内审(初稿)、
  451. //新申请第一次返稿(第一次发客户文档)、
  452. //新申请文档(定稿文档)”
  453. var table_filelist = waitGetElementById(wait, "table_filelist");
  454. System.Threading.Thread.Sleep(500);
  455. //定稿文件
  456. try
  457. {
  458. retObject.finallyFile = null;
  459. retObject.finallyFile = Download(driver, wait, table_filelist, "新申请文档", strDownloadPath);
  460. //dynamic config = new { fileNameCol = 2, fileTypeCol = 4, uploadDateCol = 7 };
  461. //retObject.finallyFile = Download(driver, wait, table_filelist, config, "新申请文档", strDownloadPath);
  462. retObject.finallyFile = CopyFile(retObject.finallyFile);
  463. }
  464. catch { }
  465. if (retObject.firstReturnFile == null)
  466. {
  467. //新申请第一次返稿文件
  468. try
  469. {
  470. retObject.firstReturnFile = Download(driver, wait, table_filelist, "新申请第一次返稿", strDownloadPath);
  471. retObject.firstReturnFile = CopyFile(retObject.firstReturnFile);
  472. }
  473. catch (Exception ex)
  474. {
  475. }
  476. }
  477. //初稿文件
  478. try
  479. {
  480. retObject.draftFile = null;
  481. waitGetElementById(wait, "draftfiletoggle").Click();
  482. var table_draffilelist = waitGetElementById(wait, "table_draftfilelist");
  483. System.Threading.Thread.Sleep(500);
  484. dynamic config = new { fileNameCol = 1, fileTypeCol = 3, uploadDateCol = 6 };
  485. retObject.draftFile = Download(driver, wait, table_draffilelist, config, "新申请第一次内审", strDownloadPath, new string[] { "申请文件", "权利要求", "申请文档" }, new string[] { "检索报告", "查新报告" });
  486. retObject.draftFile = CopyFile(retObject.draftFile);
  487. }
  488. catch { }
  489. if (Directory.Exists(strDownloadPath))
  490. {
  491. Directory.Delete(strDownloadPath, true);
  492. }
  493. }
  494. catch (Exception ex)
  495. {
  496. throw new Exception(ex.Message, ex);
  497. }
  498. finally
  499. {
  500. driver.Quit();
  501. killChromProcess();
  502. }
  503. }
  504. return retObject;
  505. }
  506. /// <summary>
  507. /// 获取当前为递交中或前一天完成的新申请案件清单
  508. /// </summary>
  509. /// <param name="type">类型0:递交中、1:前一天完成</param>
  510. /// <returns></returns>
  511. /// <exception cref="Exception"></exception>
  512. public static DataTable GetFinished3FilesCases(int type, DateTime start, DateTime end)
  513. {
  514. DataTable retObject = new DataTable();
  515. using (IWebDriver driver = CreateChromeDriver())
  516. {
  517. try
  518. {
  519. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));
  520. Login(driver, wait);
  521. //点击顶部菜单栏中的案件管理菜单
  522. IWebElement linkCaseManager = waitGetElementByName(wait, "71A7CC35-F597-40E1-9FEF-BE622A3A3B63");
  523. linkCaseManager.Click();
  524. IWebElement linkCaseSearch = wait.Until((d) =>
  525. {
  526. try
  527. {
  528. return driver.FindElement(By.LinkText("案件查询"));
  529. }
  530. catch
  531. {
  532. return null;
  533. }
  534. });
  535. driver.ExecuteJavaScript("arguments[0].click();", linkCaseSearch);
  536. //linkCaseSearch.Click();
  537. IWebElement patentSearch = waitGetElementByName(wait, "4df7eee3-426f-4ce5-9204-34ccb0fd27f7");
  538. driver.ExecuteJavaScript("arguments[0].click();", patentSearch);
  539. //patentSearch.Click();
  540. driver.SwitchTo().Frame(1);
  541. #region 添加检索条件
  542. var chkDoItem = waitGetElementById(wait, "is_proc");
  543. chkDoItem.Click();
  544. var ictrlproc = waitGetElementById(wait, "i_ctrl_proc");
  545. ictrlproc.Click();
  546. var ctrl_proc_id = waitGetElementById(wait, "ctrl_proc_id");
  547. ctrl_proc_id.FindElements(By.TagName("li"));
  548. var ellis = waitGetElementsByTagName(wait, "li", ctrl_proc_id);
  549. foreach (var elli in ellis)
  550. {
  551. if (elli.Text == "新申请")
  552. {
  553. var chk = waitGetElementByClassName(wait, "chk", elli);
  554. chk.Click();
  555. break;
  556. }
  557. System.Diagnostics.Debug.WriteLine(elli.Text);
  558. }
  559. //var chkXSQ = waitGetElementById(wait, "ctrl_proc_id_4_check");
  560. //chkXSQ.Click();
  561. var btnOk = waitGetElementById(wait, "ctrl_proc_ida_ok");
  562. btnOk.Click();
  563. waitGetElementById(wait, "proc_status").Click();
  564. if (type == 0)
  565. {
  566. waitGetElementById(wait, "procstatus_5_check").Click();
  567. waitGetElementById(wait, "procstatusa_ok").Click();
  568. }
  569. else
  570. {
  571. if (type == 1)
  572. {
  573. waitGetElementById(wait, "procstatus_12_check").Click();
  574. waitGetElementById(wait, "procstatusa_ok").Click();
  575. Log($"{DateTime.Now}\t输入处理事项完成日期:开始日期");
  576. var startDate = wait.Until((d) =>
  577. {
  578. return d.FindElement(By.Id("finish_date_start"));
  579. });
  580. driver.ExecuteJavaScript("arguments[0].scrollIntoView();", startDate);
  581. startDate.Click();
  582. System.Threading.Thread.Sleep(500);
  583. startDate.SendKeys(start.ToString("yyyy-MM-dd"));
  584. Log($"{DateTime.Now}\t输入处理事项完成日期:结束日期");
  585. var endDate = wait.Until((d) =>
  586. {
  587. try
  588. {
  589. return d.FindElement(By.Id("finish_date_end"));
  590. }
  591. catch
  592. {
  593. return null;
  594. }
  595. });
  596. driver.ExecuteJavaScript("arguments[0].scrollIntoView();", endDate);
  597. endDate.Click();
  598. System.Threading.Thread.Sleep(500);
  599. endDate.SendKeys(end.ToString("yyyy-MM-dd"));
  600. }
  601. }
  602. //waitGetElementById(wait,"procstatusa_ok").Click();
  603. #endregion
  604. #region 导出检索结果
  605. var btnSearch = waitGetElementById(wait, "btn_Search");// driver.FindElement(By.Id("btn_Search"));
  606. driver.ExecuteJavaScript("arguments[0].click();", btnSearch);
  607. Log($"{DateTime.Now}\t切换到弹出的导出报表窗口,点击导出按钮");
  608. var btnExport = waitGetElementById(wait, "btn_Export");
  609. driver.ExecuteJavaScript("arguments[0].click();", btnExport);
  610. Log($"{DateTime.Now}\t切换到弹出的导出报表窗口,点击导出按钮");
  611. driver.SwitchTo().DefaultContent();
  612. var ihg_export = driver.FindElement(By.Name("ihg_export"));
  613. driver.SwitchTo().Frame(ihg_export);
  614. waitGetElementById(wait, "btnSubmit").Click();
  615. //切换到弹出的下载报表界面,点击下载按钮
  616. Log($"{DateTime.Now}\t切换到弹出的下载报表界面,点击下载按钮");
  617. //System.Threading.Thread.Sleep(3000);
  618. driver.SwitchTo().DefaultContent();
  619. var frameDownload = waitGetElementByName(wait, "DownloadList");
  620. driver.SwitchTo().Frame(frameDownload);
  621. //driver.FindElement(By.CssSelector("table tbody tr:first-child"));
  622. var firstTr = wait.Until((d) =>
  623. {
  624. return d.FindElement(By.CssSelector("table tbody tr"));
  625. });
  626. var tdStatus = firstTr.FindElement(By.XPath(".//td")).FindElement(By.XPath("following-sibling::td[4]"));
  627. string strStatus = tdStatus.Text;
  628. while (strStatus.Trim() != "导出成功!")
  629. {
  630. if (strStatus.Trim() == "导出失败,请稍后重试!")
  631. {
  632. return null;
  633. }
  634. System.Threading.Thread.Sleep(5000);
  635. firstTr = wait.Until((d) =>
  636. {
  637. return d.FindElement(By.CssSelector("table tbody tr"));
  638. });
  639. tdStatus = firstTr.FindElement(By.XPath(".//td")).FindElement(By.XPath("following-sibling::td[4]"));
  640. strStatus = tdStatus.Text;
  641. }
  642. Log($"{DateTime.Now}\t点击下载按钮下载文档");
  643. firstTr = wait.Until((d) =>
  644. {
  645. return d.FindElement(By.CssSelector("table tbody tr"));
  646. });
  647. wait.Until((d) =>
  648. {
  649. return firstTr.FindElement(By.XPath(".//td/a[@title='下载']"));
  650. }).Click();
  651. var ReportName = $"案件清单({DateTime.Now.ToString("yyyy年M月d日")})";
  652. string strFilePath = System.IO.Path.Combine(strFileSavePath, $"{ReportName.Trim()}.xlsx");
  653. WaitForFileDownload(strFileSavePath, $"{ReportName.Trim()}.xlsx", TimeSpan.FromMinutes(5), out strFilePath);
  654. //删除下载记录
  655. Log($"{DateTime.Now}\t删除下载记录");
  656. firstTr = wait.Until((d) =>
  657. {
  658. return d.FindElement(By.CssSelector("table tbody tr"));
  659. });
  660. wait.Until((d) =>
  661. {
  662. return firstTr.FindElement(By.XPath(".//td/a[@title='删除']"));
  663. }).Click();
  664. #endregion
  665. #region 将下载的excel档转换成Datatable
  666. retObject = NPOIExcel.ExcelToDataTable(strFilePath.Replace("~", "_"), true, true, 1);
  667. System.IO.File.Delete(strFilePath.Replace("~", "_"));
  668. #endregion
  669. }
  670. catch (Exception ex)
  671. {
  672. throw new Exception(ex.Message, ex);
  673. }
  674. finally
  675. {
  676. driver.Quit();
  677. //killChromProcess();
  678. }
  679. }
  680. return retObject;
  681. }
  682. private static bool fileNameValid(string str, string[] filterStrings)
  683. {
  684. if (filterStrings.Length == 0)
  685. {
  686. return true;
  687. }
  688. else
  689. {
  690. foreach (string filterString in filterStrings)
  691. {
  692. if (str.Contains(filterString))
  693. {
  694. return true;
  695. }
  696. }
  697. return false;
  698. }
  699. }
  700. private static List<ReadOnlyCollection<IWebElement>> GetWeidijiaoFile(IWebDriver driver, WebDriverWait wait, IWebElement table_filelist)
  701. {
  702. var tBody = waitGetElementByTagName(wait, "tbody", table_filelist);
  703. var Rows = waitGetElementsByTagName(wait, "tr", tBody);
  704. List<ReadOnlyCollection<IWebElement>> retRows = new List<ReadOnlyCollection<IWebElement>>();
  705. DateTime dateTime = DateTime.Now;
  706. foreach (var row in Rows)
  707. {
  708. var cols = waitGetElementsByTagName(wait, "td", row);
  709. System.Threading.Thread.Sleep(500);
  710. if (cols.Count == 1 && cols[0].Text == "无数据")
  711. {
  712. break;
  713. }
  714. if (cols[3].Text == "未递交" || (cols[2].Text.Contains("申请") && !cols[2].Text.Contains("受理通知")))
  715. {
  716. if (!string.IsNullOrEmpty(cols[10].Text))
  717. {
  718. DateTime temDate = DateTime.Parse(cols[10].Text);
  719. if (temDate < dateTime)
  720. {
  721. retRows.Insert(0, cols);
  722. dateTime = temDate;
  723. }
  724. else
  725. {
  726. retRows.Add(cols);
  727. }
  728. }
  729. }
  730. }
  731. return retRows;
  732. }
  733. private static string Download(IWebDriver driver, WebDriverWait wait, IWebElement table_filelist, dynamic config, string fileType, string downloadPath = null, string[] includesStrings = null, string[] unincludeStrings = null)
  734. {
  735. if (downloadPath == null)
  736. {
  737. downloadPath = strFileSavePath;
  738. }
  739. if (unincludeStrings == null)
  740. {
  741. unincludeStrings = new string[] { };
  742. }
  743. if (includesStrings == null)
  744. {
  745. includesStrings = new string[] { };
  746. }
  747. try
  748. {
  749. driver.ExecuteJavaScript("arguments[0].scrollIntoView();", table_filelist);
  750. }
  751. catch { }
  752. var tBody = waitGetElementByTagName(wait, "tbody", table_filelist);
  753. var Rows = waitGetElementsByTagName(wait, "tr", tBody);
  754. ReadOnlyCollection<IWebElement> temRow = null;
  755. ReadOnlyCollection<IWebElement> temRow1 = null;
  756. DateTime dateTime = DateTime.Now;
  757. DateTime dateTime1 = DateTime.Now;
  758. foreach (var row in Rows)
  759. {
  760. var cols = waitGetElementsByTagName(wait, "td", row);
  761. System.Threading.Thread.Sleep(500);
  762. if (cols != null && cols.Count == 1 && cols[0].Text == "无数据")
  763. {
  764. break;
  765. }
  766. if (config.fileTypeCol > 0 && cols[config.fileTypeCol].Text == fileType)
  767. {
  768. temRow = cols;
  769. break;
  770. }
  771. else
  772. {
  773. if (unincludeStrings.Length == 0 ||
  774. ((unincludeStrings.Length > 0) && !fileNameValid(cols[config.fileNameCol].Text, unincludeStrings)
  775. ))
  776. {
  777. DateTime temDate = DateTime.Parse(cols[config.uploadDateCol].Text);
  778. if (fileNameValid(cols[config.fileNameCol].Text, includesStrings))
  779. {
  780. if (temRow == null)
  781. {
  782. temRow = cols;
  783. dateTime = temDate;
  784. }
  785. else
  786. {
  787. if (temDate < dateTime)
  788. {
  789. temRow = cols;
  790. dateTime = temDate;
  791. }
  792. }
  793. }
  794. else
  795. {
  796. if (temRow1 == null)
  797. {
  798. temRow1 = cols;
  799. dateTime1 = temDate;
  800. }
  801. else
  802. {
  803. if (temDate < dateTime1)
  804. {
  805. temRow1 = cols;
  806. dateTime1 = temDate;
  807. }
  808. }
  809. }
  810. }
  811. else
  812. {
  813. DateTime temDate = DateTime.Parse(cols[config.uploadDateCol].Text);
  814. if (fileNameValid(cols[config.fileNameCol].Text, includesStrings))
  815. {
  816. if (temRow1 == null)
  817. {
  818. temRow1 = cols;
  819. dateTime1 = temDate;
  820. }
  821. else
  822. {
  823. if (temDate < dateTime1)
  824. {
  825. temRow1 = cols;
  826. dateTime1 = temDate;
  827. }
  828. }
  829. }
  830. }
  831. }
  832. }
  833. if (temRow == null && temRow1 != null)
  834. {
  835. temRow = temRow1;
  836. }
  837. if (temRow != null)
  838. {
  839. //清除下载路径的文件
  840. Directory.Delete(downloadPath, true);
  841. Directory.CreateDirectory(downloadPath);
  842. var btnDownload = waitGetElementByClassName(wait, "tbdownload", temRow[temRow.Count - 1]);
  843. try
  844. {
  845. driver.ExecuteJavaScript("arguments[0].scrollIntoView();", btnDownload);
  846. }
  847. catch { }
  848. System.Threading.Thread.Sleep(500);
  849. driver.ExecuteJavaScript("arguments[0].click();", btnDownload);
  850. #region 等待文件下载完
  851. string filePath = WaitForFileDownload(downloadPath, TimeSpan.FromMinutes(5));
  852. return filePath;
  853. #endregion
  854. }
  855. return null;
  856. }
  857. private static string Download(IWebDriver driver, WebDriverWait wait, IWebElement table_filelist, string fileType, string downloadPath = null)
  858. {
  859. try
  860. {
  861. driver.ExecuteJavaScript("arguments[0].scrollIntoView();", table_filelist);
  862. }
  863. catch { }
  864. if (string.IsNullOrEmpty(downloadPath))
  865. {
  866. downloadPath = strFileSavePath;
  867. }
  868. var tBody = waitGetElementByTagName(wait, "tbody", table_filelist);
  869. var finallyFiles = wait.Until((d) =>
  870. {
  871. try
  872. {
  873. return tBody.FindElements(By.XPath($".//td[@colname='file_desc'][normalize-space()='{fileType}']"));
  874. }
  875. catch
  876. {
  877. return null;
  878. }
  879. });
  880. if (finallyFiles == null && finallyFiles.Count > 0)
  881. {
  882. return null;
  883. }
  884. foreach (var finallyFile in finallyFiles)
  885. {
  886. var tdfileName = wait.Until((d) =>
  887. {
  888. try
  889. {
  890. return finallyFile.FindElement(By.XPath("preceding-sibling::*[2]"));
  891. }
  892. catch
  893. {
  894. return null;
  895. }
  896. });
  897. string fileName = tdfileName.Text;
  898. while (string.IsNullOrEmpty(fileName))
  899. {
  900. System.Threading.Thread.Sleep(100);
  901. fileName = tdfileName.Text;
  902. }
  903. if (fileName.Contains(".doc"))
  904. {
  905. string filePath = System.IO.Path.Combine(downloadPath, fileName);
  906. if (System.IO.File.Exists(filePath))
  907. {
  908. System.IO.File.Delete(filePath);
  909. }
  910. var btnDownload = finallyFile.FindElement(By.XPath("following-sibling::*[4]"));
  911. btnDownload = waitGetElementByClassName(wait, "tbdownload", btnDownload);
  912. driver.ExecuteJavaScript("arguments[0].click();", btnDownload);
  913. WaitForFileDownload(downloadPath, fileName, TimeSpan.FromMinutes(5), out filePath);
  914. return filePath;
  915. }
  916. }
  917. return null;
  918. }
  919. private static void Login(IWebDriver driver, WebDriverWait wait)
  920. {
  921. //进入登录界面
  922. driver.Navigate().GoToUrl(ConfigHelper.GetSectionValue("IPEasySetting:IPEasyWeb"));
  923. //输入用户名和密码
  924. waitGetElementById(wait, "txtUser").SendKeys(Account);
  925. waitGetElementById(wait, "txtPwd").SendKeys(Password);
  926. //点击登录按钮
  927. waitGetElementById(wait, "btnLogin").Click();
  928. //关闭提示遮罩层
  929. waitGetElementById(wait, "jpwClose").Click();
  930. }
  931. public static void DownloadReport(string strId, string filename)
  932. {
  933. using (IWebDriver driver = CreateChromeDriver())
  934. {
  935. try
  936. {
  937. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
  938. Login(driver, wait);
  939. //点击顶部菜单栏中的报表管理菜单
  940. waitGetElementById(wait, "970d33d5-c728-41b8-a060-4330610706b9").Click();
  941. //driver.FindElement(By.Name("970d33d5-c728-41b8-a060-4330610706b9")).Click();
  942. //点击左侧 自定义报表 菜单
  943. waitGetElementByName(wait, "642fa96f-1e1f-46fd-aaa4-cb461ee8df5b").Click();
  944. //driver.FindElement(By.Name("642fa96f-1e1f-46fd-aaa4-cb461ee8df5b")).Click();
  945. //切换到自定义报表Frame
  946. driver.SwitchTo().Frame(1);
  947. //调用报表导出JS
  948. ((IJavaScriptExecutor)driver).ExecuteScript($"Report.Export('{strId}');");
  949. //切换到弹出的导出报表窗口,点击导出按钮
  950. driver.SwitchTo().DefaultContent();
  951. var ihg_export = waitGetElementByName(wait, "ihg_export"); //driver.FindElement(By.Name("ihg_export"));
  952. driver.SwitchTo().Frame(ihg_export);
  953. waitGetElementById(wait, "btnSubmit").Click();
  954. //driver.FindElement(By.Id("btnSubmit")).Click();
  955. string strRetFile = null;
  956. WaitForFileDownload(strFileSavePath, filename, TimeSpan.FromMinutes(5), out strRetFile);
  957. }
  958. catch (Exception ex)
  959. {
  960. throw new Exception(ex.Message);
  961. }
  962. finally
  963. {
  964. driver.Quit();
  965. driver.Dispose();
  966. killChromProcess();
  967. }
  968. }
  969. }
  970. private static void Log(string strMessage)
  971. {
  972. StreamWriter sw = File.AppendText("c:\\temp\\log.txt");
  973. sw.WriteLine($"{strMessage}");
  974. sw.Flush();
  975. sw.Close();
  976. sw.Dispose();
  977. }
  978. private static OpenQA.Selenium.Chrome.ChromeDriver CreateChromeDriver(string downloadPath = null)
  979. {
  980. try
  981. {
  982. bool isheadless = (ConfigHelper.GetSectionValue("IPEasySetting:isHeadless") == "true");
  983. var options = new OpenQA.Selenium.Chrome.ChromeOptions();
  984. options.AddUserProfilePreference("profile.default_content_settings.popups", 0);
  985. options.AddUserProfilePreference("profile.default_content_setting_values.automatic_downloads", 1);
  986. options.AddUserProfilePreference("download.prompt_for_download", false); // 禁止下载提示
  987. if (!string.IsNullOrEmpty(downloadPath))
  988. {
  989. options.AddUserProfilePreference("download.default_directory", downloadPath);
  990. }
  991. else
  992. {
  993. options.AddUserProfilePreference("download.default_directory", strFileSavePath);
  994. }
  995. options.AddUserProfilePreference("intl.accept_languages", "nl");
  996. options.AddUserProfilePreference("disable-popup-blocking", "true");
  997. options.AddUserProfilePreference("safebrowsing.enabled", true);
  998. options.AddArgument($"--unsafely-treat-insecure-origin-as-secure={ConfigHelper.GetSectionValue("IPEasySetting:IPEasyWeb").Replace("/Login.aspx", "")}");//替换自己的域名,多域名可用逗号分隔。
  999. if (isheadless)
  1000. {
  1001. options.AddArgument("headless");
  1002. }
  1003. var driver = new OpenQA.Selenium.Chrome.ChromeDriver(ConfigHelper.GetSectionValue("IPEasySetting:ChormeDriverPath"), options);
  1004. driver.Manage().Window.Maximize();
  1005. driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(50);
  1006. driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(100);
  1007. return driver;
  1008. }
  1009. catch (Exception ex)
  1010. {
  1011. throw new Exception("创建chrome driver 出错!", ex);
  1012. }
  1013. }
  1014. /// <summary>
  1015. /// 根据报表名称导出报表
  1016. /// </summary>
  1017. /// <param name="ReportName">报告名称</param>
  1018. /// <param name="isModifyDate">是否手动修改日期范围</param>
  1019. public static DataTable DownloadReport(string ReportName, bool isModifyDate)
  1020. {
  1021. Log($"{DateTime.Now}\t开始下载:{ReportName}");
  1022. DataTable retDatatable;
  1023. Log($"{DateTime.Now}\t开始启动Chrome");
  1024. using (IWebDriver driver = CreateChromeDriver())
  1025. {
  1026. try
  1027. {
  1028. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
  1029. Login(driver, wait);
  1030. //点击顶部菜单栏中的报表管理菜单
  1031. Log($"{DateTime.Now}\t点击顶部菜单栏中的报表管理菜单");
  1032. var reportMenu = waitGetElementByName(wait, "970d33d5-c728-41b8-a060-4330610706b9");
  1033. //driver.FindElement(By.Name("970d33d5-c728-41b8-a060-4330610706b9"));
  1034. driver.ExecuteJavaScript("arguments[0].click();", reportMenu);
  1035. //点击左侧 自定义报表 菜单
  1036. Log($"{DateTime.Now}\t点击左侧 自定义报表 菜单");
  1037. var customerReportMenu = waitGetElementByName(wait, "642fa96f-1e1f-46fd-aaa4-cb461ee8df5b");
  1038. driver.ExecuteJavaScript("arguments[0].click();", customerReportMenu);
  1039. //切换到自定义报表Frame
  1040. Log($"{DateTime.Now}\t切换到自定义报表Frame");
  1041. driver.SwitchTo().Frame(1);
  1042. Log($"{DateTime.Now}\t开始搜索报告");
  1043. var inputSearch = waitGetElementById(wait, "customizedList_TxtSheetSearchKey");
  1044. Log($"{DateTime.Now}\t在搜索框中输入报告名称");
  1045. inputSearch.SendKeys(ReportName);
  1046. Log($"{DateTime.Now}\t点击搜索按钮");
  1047. var btnSearch = waitGetElementByClassName(wait, "btn-search");
  1048. btnSearch.Click();
  1049. Log($"{DateTime.Now}\t选中报告");
  1050. var reportRecord = wait.Until((d) =>
  1051. {
  1052. try
  1053. {
  1054. return d.FindElement(By.XPath($"//td[contains(text(),'{ReportName}')]"));
  1055. }
  1056. catch
  1057. {
  1058. return null;
  1059. }
  1060. });
  1061. reportRecord.Click();
  1062. if (isModifyDate)
  1063. {
  1064. Log($"{DateTime.Now}\t点击编辑");
  1065. var btnEdit = waitGetElementByClassName(wait, "edit");
  1066. btnEdit.Click();
  1067. Log($"{DateTime.Now}\t清除以选择的处理事项完成日条件");
  1068. try
  1069. {
  1070. var doItemFinished = wait.Until((d) =>
  1071. {
  1072. return d.FindElement(By.XPath("//span[contains(@objcvalue,'_date') and contains(@id,'ST;')]"));
  1073. });
  1074. doItemFinished.Click();
  1075. }
  1076. catch { }
  1077. Log($"{DateTime.Now}\t输入处理事项完成日期:开始日期");
  1078. var startDate = wait.Until((d) =>
  1079. {
  1080. return d.FindElement(By.XPath("//input[contains(@id,'dt_s_')]"));
  1081. });
  1082. //将界面滚动到开始日期栏位,以使开始日期栏位可见
  1083. driver.ExecuteJavaScript("arguments[0].scrollIntoView();", startDate);
  1084. startDate.Click();
  1085. System.Threading.Thread.Sleep(3000);
  1086. startDate.SendKeys(new DateTime(DateTime.Now.AddMonths(-1).Year, DateTime.Now.AddMonths(-1).Month, 1).ToString("yyyy-MM-dd"));
  1087. Log($"{DateTime.Now}\t输入处理事项完成日期:结束日期");
  1088. var endDate = wait.Until((d) =>
  1089. {
  1090. try
  1091. {
  1092. return d.FindElement(By.XPath("//input[contains(@id,'dt_e_')]"));//.Id("dt_e_4F8FE88D-9040-45F1-9723-45699BCD4CAF"));
  1093. }
  1094. catch
  1095. {
  1096. return null;
  1097. }
  1098. });
  1099. endDate.Click();
  1100. System.Threading.Thread.Sleep(3000);
  1101. endDate.SendKeys(new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddDays(-1).ToString("yyyy-MM-dd"));
  1102. Log($"{DateTime.Now}\t添加处理事项检索条件");
  1103. var addDate = wait.Until((d) =>
  1104. {
  1105. try
  1106. {
  1107. return d.FindElement(By.XPath("//a[contains(@onclick,'ReportSub.ConditionDTSelect')]"));
  1108. }
  1109. catch
  1110. {
  1111. return null;
  1112. }
  1113. });
  1114. addDate.Click();
  1115. //System.Threading.Thread.Sleep(500);
  1116. Log($"{DateTime.Now}\t保存检索条件");
  1117. var btnSave = waitGetElementById(wait, "save"); // driver.FindElement(By.Id("save"));
  1118. btnSave.Click();
  1119. //System.Threading.Thread.Sleep(3000);
  1120. }
  1121. Log($"{DateTime.Now}\t点击导出Excel链接");
  1122. var linkExport = wait.Until((d) =>
  1123. {
  1124. try
  1125. {
  1126. return d.FindElement(By.XPath("//a[contains(@onclick,'-') and @class='tbexcel']"));
  1127. }
  1128. catch
  1129. {
  1130. return null;
  1131. }
  1132. });
  1133. driver.ExecuteJavaScript("arguments[0].click();", linkExport);
  1134. //linkExport.Click();
  1135. //切换到弹出的导出报表窗口,点击导出按钮
  1136. Log($"{DateTime.Now}\t切换到弹出的导出报表窗口,点击导出按钮");
  1137. driver.SwitchTo().DefaultContent();
  1138. var ihg_export = driver.FindElement(By.Name("ihg_export"));
  1139. driver.SwitchTo().Frame(ihg_export);
  1140. waitGetElementById(wait, "btnSubmit").Click();
  1141. //切换到弹出的下载报表界面,点击下载按钮
  1142. Log($"{DateTime.Now}\t切换到弹出的下载报表界面,点击下载按钮");
  1143. //System.Threading.Thread.Sleep(3000);
  1144. driver.SwitchTo().DefaultContent();
  1145. var frameDownload = waitGetElementByName(wait, "DownloadList");
  1146. driver.SwitchTo().Frame(frameDownload);
  1147. var firstTr = wait.Until((d) =>
  1148. {
  1149. return d.FindElement(By.CssSelector("table tbody tr"));
  1150. });
  1151. var tdStatus = wait.Until((d) =>
  1152. {
  1153. return firstTr.FindElement(By.XPath(".//td")).FindElement(By.XPath("following-sibling::td[4]"));
  1154. });
  1155. string strStatus = tdStatus.Text;
  1156. while (strStatus.Trim() != "导出成功!")
  1157. {
  1158. if (strStatus.Trim() == "导出失败,请稍后重试!")
  1159. {
  1160. return null;
  1161. }
  1162. System.Threading.Thread.Sleep(5000);
  1163. firstTr = wait.Until((d) =>
  1164. {
  1165. return d.FindElement(By.CssSelector("table tbody tr"));
  1166. });
  1167. tdStatus = wait.Until((d) =>
  1168. {
  1169. return firstTr.FindElement(By.XPath(".//td")).FindElement(By.XPath("following-sibling::td[4]"));
  1170. });
  1171. strStatus = tdStatus.Text;
  1172. }
  1173. Log($"{DateTime.Now}\t点击下载按钮下载文档");
  1174. firstTr = wait.Until((d) =>
  1175. {
  1176. return d.FindElement(By.CssSelector("table tbody tr"));
  1177. });
  1178. firstTr.FindElement(By.XPath(".//td/a[@title='下载']")).Click();
  1179. //System.Threading.Thread.Sleep(5000);
  1180. //btnDownload.Click();
  1181. string strFilePath = System.IO.Path.Combine(strFileSavePath, $"{ReportName.Trim()}.xlsx");
  1182. WaitForFileDownload(strFileSavePath, $"{ReportName.Trim()}.xlsx", TimeSpan.FromMinutes(5), out strFilePath);
  1183. //删除下载记录
  1184. Log($"{DateTime.Now}\t删除下载记录");
  1185. firstTr = wait.Until((d) =>
  1186. {
  1187. return d.FindElement(By.CssSelector("table tbody tr"));
  1188. });
  1189. firstTr.FindElement(By.XPath(".//td/a[@title='删除']")).Click();
  1190. //System.IO.FileInfo file = new System.IO.FileInfo(strFilePath.Replace("~", "_"));
  1191. retDatatable = NPOIExcel.ExcelToDataTable(strFilePath.Replace("~", "_"), true);
  1192. System.IO.File.Delete(strFilePath.Replace("~", "_"));
  1193. }
  1194. catch (Exception ex)
  1195. {
  1196. Log(ex.ToString());
  1197. throw new Exception(ex.Message, ex);
  1198. }
  1199. finally
  1200. {
  1201. Log("关闭Chrome");
  1202. driver.Quit();
  1203. driver.Dispose();
  1204. killChromProcess();
  1205. }
  1206. }
  1207. Log($"{DateTime.Now}\t返回数据");
  1208. return retDatatable;
  1209. }
  1210. /// <summary>
  1211. /// 获取案件基本信息
  1212. /// </summary>
  1213. /// <param name="caseNo">我方文号</param>
  1214. /// <returns></returns>
  1215. public static dynamic GetCaseInfo(string caseNo)
  1216. {
  1217. dynamic retObject = new ExpandoObject();
  1218. retObject.CaseNo = caseNo.Trim();
  1219. using (IWebDriver driver = CreateChromeDriver())
  1220. {
  1221. try
  1222. {
  1223. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
  1224. Login(driver, wait);
  1225. //点击顶部菜单栏中的案件管理菜单
  1226. waitGetElementByName(wait, "71A7CC35-F597-40E1-9FEF-BE622A3A3B63").Click();
  1227. //点击左侧 查询 菜单
  1228. waitGetElementByName(wait, "c3266ab3-521a-4815-8aaf-7dd0bc5a76af").Click();
  1229. //切换到自定义报表Frame
  1230. driver.SwitchTo().Frame(1);
  1231. var inputSearch = waitGetElementById(wait, "case_volume");
  1232. inputSearch.SendKeys(caseNo.Trim());
  1233. var btnSearch = waitGetElementById(wait, "btn_Search");
  1234. btnSearch.Click();
  1235. var caseLink = wait.Until((d) =>
  1236. {
  1237. return d.FindElement(By.XPath($"//a[contains(text(),'{caseNo}')]"));
  1238. });
  1239. caseLink.Click();
  1240. driver.SwitchTo().ParentFrame().SwitchTo().Frame(2);
  1241. //等待页面上ID属性值为submitButton的元素加载完成
  1242. IWebElement myElement = wait.Until((d) =>
  1243. {
  1244. try
  1245. {
  1246. return d.FindElement(By.Id("libase"));
  1247. }
  1248. catch
  1249. {
  1250. return null;
  1251. }
  1252. });
  1253. myElement.Click();
  1254. //driver.FindElement(By.Id("libase")).Click();
  1255. retObject.CaseName = driver.FindElement(By.Id("p_case_info__case_name")).GetAttribute("value"); //案件名称
  1256. retObject.CustomerName = driver.FindElement(By.Id("p_case_info__customer_id")).GetAttribute("value").Replace("(null)", ""); //客户名称
  1257. retObject.BusinessType = driver.FindElement(By.Id("p_case_info__business_type_id")).GetAttribute("value"); //业务类型
  1258. retObject.CaseState = GetSelectText(driver.FindElement(By.Id("p_case_info__case_status_id")));
  1259. retObject.ApplicationType = GetSelectText(driver.FindElement(By.Id("p_case_info__apply_type_id")));
  1260. retObject.CaseType = driver.FindElement(By.Id("p_case_info__case_type_id")).GetAttribute("value"); //案件类型
  1261. retObject.EntrustingDate = driver.FindElement(By.Id("p_case_info__charge_date")).GetAttribute("value"); //委案日期
  1262. retObject.CaseMemo = driver.FindElement(By.Id("p_case_info__remark")).GetAttribute("value"); //案件备注
  1263. driver.FindElement(By.XPath($"//span[contains(text(),'扩展信息')]")).Click();
  1264. //select[@id='p_case_info__case_coefficient_id']
  1265. retObject.CaseCoefficient = GetSelectText(driver.FindElement(By.Id("p_case_info__case_coefficient_id")));
  1266. }
  1267. catch (Exception ex)
  1268. {
  1269. throw new Exception(ex.Message, ex);
  1270. }
  1271. finally
  1272. {
  1273. driver.Quit();
  1274. killChromProcess();
  1275. }
  1276. }
  1277. return retObject;
  1278. }
  1279. public static dynamic GetPerformanceRecord(string caseNo, List<string> doItemNames)
  1280. {
  1281. dynamic retObject = new ExpandoObject();
  1282. retObject.CaseNo = caseNo.Trim();
  1283. using (var Service = ChromeDriverService.CreateDefaultService(ConfigHelper.GetSectionValue("IPEasySetting:ChormeDriverPath")))
  1284. {
  1285. Service.Start();
  1286. using (IWebDriver driver = CreateChromeDriver())
  1287. {
  1288. try
  1289. {
  1290. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
  1291. Login(driver, wait);
  1292. //点击顶部菜单栏中的案件管理菜单
  1293. waitGetElementByName(wait, "71A7CC35-F597-40E1-9FEF-BE622A3A3B63").Click();
  1294. //点击左侧 查询 菜单
  1295. waitGetElementByName(wait, "c3266ab3-521a-4815-8aaf-7dd0bc5a76af").Click();
  1296. driver.SwitchTo().Frame(1);
  1297. var inputSearch = wait.Until((d) =>
  1298. {
  1299. try
  1300. {
  1301. //切换到自定义报表Frame
  1302. return d.FindElement(By.Id("case_volume"));
  1303. }
  1304. catch
  1305. {
  1306. return null;
  1307. }
  1308. });
  1309. inputSearch.SendKeys(caseNo.Trim());
  1310. var btnSearch = waitGetElementById(wait, "btn_Search");
  1311. btnSearch.Click();
  1312. var caseLink = wait.Until((d) =>
  1313. {
  1314. try
  1315. {
  1316. return d.FindElement(By.XPath($"//a[normalize-space()='{caseNo.Trim()}']"));
  1317. }
  1318. catch
  1319. {
  1320. return null;
  1321. }
  1322. });
  1323. caseLink = driver.FindElement(By.XPath($"//a[normalize-space()='{caseNo.Trim()}']"));
  1324. caseLink.Click();
  1325. System.Threading.Thread.Sleep(200);
  1326. driver.SwitchTo().ParentFrame().SwitchTo().Frame(2);
  1327. IWebElement temDoItemLink = null;
  1328. string temFinishedDate = "";
  1329. string xpathQuery = "";
  1330. foreach (string doItemName in doItemNames)
  1331. {
  1332. xpathQuery = string.IsNullOrEmpty(xpathQuery) ? $"normalize-space()='{doItemName}'" : $"{xpathQuery} or normalize-space()='{doItemName}'";
  1333. }
  1334. //foreach (string doItemName in doItemNames)
  1335. //{
  1336. var DoItemLinks = wait.Until((d) =>
  1337. {
  1338. d.SwitchTo().DefaultContent().SwitchTo().Frame(2);
  1339. return d.FindElements(By.XPath($"//td[@colname='ctrl_proc' and ({xpathQuery})]"));
  1340. });
  1341. if (DoItemLinks.Count > 0)
  1342. {
  1343. var DoItemLink = DoItemLinks[DoItemLinks.Count - 1];
  1344. if (string.IsNullOrEmpty(temFinishedDate))
  1345. {
  1346. temFinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text;
  1347. temDoItemLink = DoItemLink;
  1348. }
  1349. else
  1350. {
  1351. if (DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text.CompareTo(temFinishedDate) > 0)
  1352. {
  1353. temFinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text;
  1354. temDoItemLink = DoItemLink;
  1355. }
  1356. }
  1357. }
  1358. //}
  1359. if (temDoItemLink != null)
  1360. {
  1361. retObject.CaseStage = temDoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //案件阶段
  1362. retObject.DoItemState = temDoItemLink.FindElement(By.XPath("following-sibling::td[2]")).Text; //处理事项处理状态
  1363. retObject.InternalDate = temDoItemLink.FindElement(By.XPath("following-sibling::td[4]")).Text; //内部期限
  1364. retObject.CustomerLimitDate = temDoItemLink.FindElement(By.XPath("following-sibling::td[5]")).Text; //客户期限
  1365. retObject.FinishedDate = temDoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text; //处理事项完成日
  1366. retObject.DoPersons = temDoItemLink.FindElement(By.XPath("following-sibling::td[8]")).Text; //处理人
  1367. retObject.ExternalHandler = temDoItemLink.FindElement(By.XPath("following-sibling::td[9]")).Text; //对外处理人
  1368. retObject.Reviewer = temDoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text.Replace(";", ""); //核稿人
  1369. retObject.DoItemMemo = temDoItemLink.FindElement(By.XPath("following-sibling::td[12]")).Text; //处理事项备注
  1370. retObject.DoItem = temDoItemLink.Text;
  1371. //temDoItemLink = DoItemLink;
  1372. temDoItemLink.Click();
  1373. }
  1374. else
  1375. {
  1376. throw new ApplicationException("处理事项不存在!");
  1377. }
  1378. var p_proc_finish_doc_date = wait.Until((d) =>
  1379. {
  1380. try
  1381. {
  1382. return d.FindElement(By.Id("p_proc_info__finish_doc_date"));
  1383. }
  1384. catch
  1385. {
  1386. return null;
  1387. }
  1388. });
  1389. //System.Threading.Thread.Sleep(500);
  1390. retObject.FinalizationDate = p_proc_finish_doc_date.GetAttribute("value"); //定稿日
  1391. retObject.ReturnDate = driver.FindElement(By.Id("p_proc_info__back_date")).GetAttribute("value"); //返稿日
  1392. retObject.Reviewer = driver.FindElement(By.Id("p_proc_info__revise_user")).GetAttribute("value"); //核稿人
  1393. retObject.DoItemCoefficient = driver.FindElement(By.Id("p_proc_info__proc_coefficient")).GetAttribute("value"); //处理事项系数
  1394. retObject.WordCount = driver.FindElement(By.Id("p_proc_info__translate_count")).GetAttribute("value"); //翻译字数
  1395. driver.FindElement(By.Id("libase")).Click();
  1396. var p_case_info__case_name = wait.Until((d) =>
  1397. {
  1398. try
  1399. {
  1400. return d.FindElement(By.Id("p_case_info__case_name"));
  1401. }
  1402. catch
  1403. {
  1404. return null;
  1405. }
  1406. });
  1407. retObject.CaseName = p_case_info__case_name.GetAttribute("value"); //案件名称
  1408. retObject.CustomerName = driver.FindElement(By.Id("p_case_info__customer_id")).GetAttribute("value"); //客户名称
  1409. retObject.BusinessType = driver.FindElement(By.Id("p_case_info__business_type_id")).GetAttribute("value"); //业务类型
  1410. retObject.CaseState = GetSelectText(driver.FindElement(By.Id("p_case_info__case_status_id")));
  1411. retObject.ApplicationType = GetSelectText(driver.FindElement(By.Id("p_case_info__apply_type_id")));
  1412. retObject.CaseType = driver.FindElement(By.Id("p_case_info__case_type_id")).GetAttribute("value"); //案件类型
  1413. retObject.EntrustingDate = driver.FindElement(By.Id("p_case_info__charge_date")).GetAttribute("value"); //委案日期
  1414. retObject.CaseMemo = driver.FindElement(By.Id("p_case_info__remark")).GetAttribute("value"); //案件备注
  1415. driver.FindElement(By.XPath($"//span[contains(text(),'扩展信息')]")).Click();
  1416. //select[@id='p_case_info__case_coefficient_id']
  1417. retObject.CaseCoefficient = GetSelectText(driver.FindElement(By.Id("p_case_info__case_coefficient_id")));
  1418. }
  1419. catch (Exception ex)
  1420. {
  1421. throw new Exception(ex.Message, ex);
  1422. }
  1423. finally
  1424. {
  1425. driver.Quit();
  1426. killChromProcess();
  1427. }
  1428. }
  1429. Service.Dispose();
  1430. }
  1431. return retObject;
  1432. }
  1433. /// <summary>
  1434. /// 获取案件处理事项记录
  1435. /// </summary>
  1436. /// <param name="caseNo">我方文号</param>
  1437. /// <param name="doItemName">处理事项</param>
  1438. /// <returns></returns>
  1439. public static dynamic GetPerformanceRecord(string caseNo, string doItemName, string caseStage = null)
  1440. {
  1441. if (caseNo.Contains("APCN"))
  1442. {
  1443. //商标
  1444. return GetAPCNPerformanceRecord(caseNo, doItemName, caseStage);
  1445. }
  1446. dynamic retObject = new ExpandoObject();
  1447. retObject.CaseNo = caseNo.Trim();
  1448. retObject.DoItem = doItemName;
  1449. var splitNos= caseNo.Split(new char[] { '-' },StringSplitOptions.RemoveEmptyEntries);
  1450. var temNo = splitNos[0].Trim();
  1451. using (var Service = ChromeDriverService.CreateDefaultService(ConfigHelper.GetSectionValue("IPEasySetting:ChormeDriverPath")))
  1452. {
  1453. Service.Start();
  1454. using (IWebDriver driver = CreateChromeDriver())
  1455. {
  1456. try
  1457. {
  1458. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
  1459. Login(driver, wait);
  1460. //点击顶部菜单栏中的案件管理菜单
  1461. waitGetElementByName(wait, "71A7CC35-F597-40E1-9FEF-BE622A3A3B63").Click();
  1462. //点击左侧 查询 菜单
  1463. waitGetElementByName(wait, "c3266ab3-521a-4815-8aaf-7dd0bc5a76af").Click();
  1464. driver.SwitchTo().Frame(1);
  1465. var inputSearch = wait.Until((d) =>
  1466. {
  1467. try
  1468. {
  1469. return d.FindElement(By.Id("case_volume"));
  1470. }
  1471. catch
  1472. {
  1473. return null;
  1474. }
  1475. });
  1476. inputSearch.SendKeys(temNo);
  1477. var btnSearch = waitGetElementById(wait, "btn_Search");
  1478. btnSearch.Click();
  1479. var caseLink = wait.Until((d) =>
  1480. {
  1481. try
  1482. {
  1483. return d.FindElement(By.XPath($"//a[starts-with(normalize-space(), '{temNo}')]"));
  1484. }
  1485. catch
  1486. {
  1487. return null;
  1488. }
  1489. });
  1490. caseLink.Click();
  1491. System.Threading.Thread.Sleep(1000);
  1492. var DoItemLinks = wait.Until((d) =>
  1493. {
  1494. d.SwitchTo().DefaultContent().SwitchTo().Frame(2);
  1495. return d.FindElements(By.XPath($"//td[@colname='ctrl_proc'][normalize-space()='{doItemName}']"));
  1496. });
  1497. if (DoItemLinks.Count > 0)
  1498. {
  1499. if (!string.IsNullOrEmpty(caseStage))
  1500. {
  1501. foreach (var DoItemLink in DoItemLinks)
  1502. {
  1503. var temCaseStage = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text;
  1504. if (temCaseStage == caseStage)
  1505. {
  1506. retObject.CaseStage = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //案件阶段
  1507. retObject.DoItemState = DoItemLink.FindElement(By.XPath("following-sibling::td[2]")).Text; //处理事项处理状态
  1508. retObject.InternalDate = DoItemLink.FindElement(By.XPath("following-sibling::td[4]")).Text; //内部期限
  1509. retObject.CustomerLimitDate = DoItemLink.FindElement(By.XPath("following-sibling::td[5]")).Text; //客户期限
  1510. retObject.FinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text; //处理事项完成日
  1511. retObject.DoPersons = DoItemLink.FindElement(By.XPath("following-sibling::td[8]")).Text; //处理人
  1512. retObject.ExternalHandler = DoItemLink.FindElement(By.XPath("following-sibling::td[9]")).Text; //对外处理人
  1513. retObject.Reviewer = DoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //核稿人
  1514. retObject.DoItemMemo = DoItemLink.FindElement(By.XPath("following-sibling::td[12]")).Text; //处理事项备注
  1515. DoItemLink.Click();
  1516. break;
  1517. }
  1518. }
  1519. }
  1520. else
  1521. {
  1522. var DoItemLink = DoItemLinks[DoItemLinks.Count - 1];
  1523. retObject.CaseStage = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //案件阶段
  1524. retObject.DoItemState = DoItemLink.FindElement(By.XPath("following-sibling::td[2]")).Text; //处理事项处理状态
  1525. retObject.InternalDate = DoItemLink.FindElement(By.XPath("following-sibling::td[4]")).Text; //内部期限
  1526. retObject.CustomerLimitDate = DoItemLink.FindElement(By.XPath("following-sibling::td[5]")).Text; //客户期限
  1527. retObject.FinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text; //处理事项完成日
  1528. retObject.DoPersons = DoItemLink.FindElement(By.XPath("following-sibling::td[8]")).Text; //处理人
  1529. retObject.ExternalHandler = DoItemLink.FindElement(By.XPath("following-sibling::td[9]")).Text; //对外处理人
  1530. retObject.Reviewer = DoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //核稿人
  1531. retObject.DoItemMemo = DoItemLink.FindElement(By.XPath("following-sibling::td[12]")).Text; //处理事项备注
  1532. DoItemLink.Click();
  1533. }
  1534. }
  1535. var p_proc_finish_doc_date = wait.Until((d) =>
  1536. {
  1537. try
  1538. {
  1539. return d.FindElement(By.Id("p_proc_info__finish_doc_date"));
  1540. }
  1541. catch
  1542. {
  1543. return null;
  1544. }
  1545. });
  1546. retObject.FinalizationDate = p_proc_finish_doc_date.GetAttribute("value"); //定稿日
  1547. retObject.ReturnDate = driver.FindElement(By.Id("p_proc_info__back_date")).GetAttribute("value"); //返稿日
  1548. retObject.Reviewer = driver.FindElement(By.Id("p_proc_info__revise_user")).GetAttribute("value"); //核稿人
  1549. retObject.DoItemCoefficient = driver.FindElement(By.Id("p_proc_info__proc_coefficient")).GetAttribute("value"); //处理事项系数
  1550. retObject.WordCount = driver.FindElement(By.Id("p_proc_info__translate_count")).GetAttribute("value"); //翻译字数
  1551. waitGetElementById(wait, "libase").Click();
  1552. var p_case_info__case_name = wait.Until((d) =>
  1553. {
  1554. try
  1555. {
  1556. return d.FindElement(By.Id("p_case_info__case_name"));
  1557. }
  1558. catch
  1559. {
  1560. return null;
  1561. }
  1562. });
  1563. retObject.CaseName = p_case_info__case_name.GetAttribute("value"); //案件名称
  1564. retObject.CustomerName = driver.FindElement(By.Id("p_case_info__customer_id")).GetAttribute("value").Replace("(null)", ""); //客户名称
  1565. retObject.BusinessType = driver.FindElement(By.Id("p_case_info__business_type_id")).GetAttribute("value"); //业务类型
  1566. retObject.CaseState = GetSelectText(driver.FindElement(By.Id("p_case_info__case_status_id")));
  1567. retObject.ApplicationType = GetSelectText(driver.FindElement(By.Id("p_case_info__apply_type_id")));
  1568. retObject.CaseType = driver.FindElement(By.Id("p_case_info__case_type_id")).GetAttribute("value"); //案件类型
  1569. retObject.EntrustingDate = driver.FindElement(By.Id("p_case_info__charge_date")).GetAttribute("value"); //委案日期
  1570. retObject.CaseMemo = driver.FindElement(By.Id("p_case_info__remark")).GetAttribute("value"); //案件备注
  1571. driver.FindElement(By.XPath($"//span[contains(text(),'扩展信息')]")).Click();
  1572. retObject.CaseCoefficient = GetSelectText(driver.FindElement(By.Id("p_case_info__case_coefficient_id")));
  1573. }
  1574. catch (Exception ex)
  1575. {
  1576. throw new Exception(ex.Message, ex);
  1577. }
  1578. finally
  1579. {
  1580. driver.Quit();
  1581. killChromProcess();
  1582. }
  1583. }
  1584. Service.Dispose();
  1585. }
  1586. return retObject;
  1587. }
  1588. private static dynamic GetAPCNPerformanceRecord(string caseNo, string doItemName, string caseStage = null)
  1589. {
  1590. dynamic retObject = new ExpandoObject();
  1591. retObject.CaseNo = caseNo.Trim();
  1592. retObject.DoItem = doItemName;
  1593. using (var Service = ChromeDriverService.CreateDefaultService(ConfigHelper.GetSectionValue("IPEasySetting:ChormeDriverPath")))
  1594. {
  1595. Service.Start();
  1596. using (IWebDriver driver = CreateChromeDriver())
  1597. {
  1598. try
  1599. {
  1600. WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
  1601. Login(driver, wait);
  1602. //点击顶部菜单栏中的案件管理菜单
  1603. driver.FindElement(By.Name("71A7CC35-F597-40E1-9FEF-BE622A3A3B63")).Click();
  1604. System.Threading.Thread.Sleep(500);
  1605. //点击左侧 查询 菜单
  1606. driver.FindElement(By.Name("FF4E1FF9-FE36-4F0F-99DF-81E60817722E")).Click();
  1607. driver.SwitchTo().Frame(1);
  1608. var inputSearch = wait.Until((d) =>
  1609. {
  1610. try
  1611. {
  1612. //切换到自定义报表Frame
  1613. return d.FindElement(By.Id("case_volume"));
  1614. }
  1615. catch
  1616. {
  1617. return null;
  1618. }
  1619. });
  1620. inputSearch.SendKeys(caseNo.Trim());
  1621. var btnSearch = waitGetElementById(wait, "btn_Search");
  1622. btnSearch.Click();
  1623. var caseLink = wait.Until((d) =>
  1624. {
  1625. try
  1626. {
  1627. return d.FindElement(By.XPath($"//a[normalize-space()='{caseNo.Trim()}']"));
  1628. }
  1629. catch
  1630. {
  1631. return null;
  1632. }
  1633. });
  1634. caseLink.Click();
  1635. driver.SwitchTo().ParentFrame().SwitchTo().Frame(2);
  1636. var DoItemLinks = wait.Until((d) =>
  1637. {
  1638. return driver.FindElements(By.XPath($"//td[@colname='ctrl_proc'][normalize-space()='{doItemName}']"));
  1639. });
  1640. if (DoItemLinks.Count > 0)
  1641. {
  1642. if (!string.IsNullOrEmpty(caseStage))
  1643. {
  1644. foreach (var DoItemLink in DoItemLinks)
  1645. {
  1646. var temCaseStage = wait.Until((d) =>
  1647. {
  1648. return DoItemLink.FindElement(By.XPath("following-sibling::td[1]"));
  1649. }).Text;
  1650. if (temCaseStage == caseStage)
  1651. {
  1652. retObject.DoItemState = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //处理事项处理状态
  1653. retObject.InternalDate = DoItemLink.FindElement(By.XPath("following-sibling::td[3]")).Text; //内部期限
  1654. retObject.CustomerLimitDate = DoItemLink.FindElement(By.XPath("following-sibling::td[4]")).Text; //客户期限
  1655. retObject.FinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[6]")).Text; //处理事项完成日
  1656. retObject.DoPersons = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text; //处理人
  1657. retObject.DoItemMemo = DoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //处理事项备注
  1658. DoItemLink.Click();
  1659. //driver.ExecuteJavaScript("$(arguments[0]).click()", DoItemLink);
  1660. break;
  1661. }
  1662. }
  1663. }
  1664. else
  1665. {
  1666. var DoItemLink = DoItemLinks[DoItemLinks.Count - 1];
  1667. //retObject.CaseStage = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //案件阶段
  1668. retObject.DoItemState = DoItemLink.FindElement(By.XPath("following-sibling::td[1]")).Text; //处理事项处理状态
  1669. retObject.InternalDate = DoItemLink.FindElement(By.XPath("following-sibling::td[3]")).Text; //内部期限
  1670. retObject.CustomerLimitDate = DoItemLink.FindElement(By.XPath("following-sibling::td[4]")).Text; //客户期限
  1671. retObject.FinishedDate = DoItemLink.FindElement(By.XPath("following-sibling::td[6]")).Text; //处理事项完成日
  1672. retObject.DoPersons = DoItemLink.FindElement(By.XPath("following-sibling::td[7]")).Text; //处理人
  1673. retObject.DoItemMemo = DoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //处理事项备注
  1674. //retObject.Reviewer = DoItemLink.FindElement(By.XPath("following-sibling::td[10]")).Text; //核稿人
  1675. DoItemLink.Click();
  1676. //new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(DoItemLink)).Click();
  1677. }
  1678. }
  1679. var p_proc_finish_doc_date = wait.Until((d) =>
  1680. {
  1681. try
  1682. {
  1683. return d.FindElement(By.Id("p_proc_info__finish_doc_date"));
  1684. }
  1685. catch
  1686. {
  1687. return null;
  1688. }
  1689. });
  1690. //System.Threading.Thread.Sleep(500);
  1691. retObject.FinalizationDate = p_proc_finish_doc_date.GetAttribute("value"); //定稿日
  1692. retObject.ReturnDate = driver.FindElement(By.Id("p_proc_info__back_date")).GetAttribute("value"); //返稿日
  1693. retObject.Reviewer = driver.FindElement(By.Id("p_proc_info__revise_user")).GetAttribute("value"); //核稿人
  1694. retObject.DoItemCoefficient = driver.FindElement(By.Id("p_proc_info__proc_coefficient")).GetAttribute("value"); //处理事项系数
  1695. retObject.WordCount = driver.FindElement(By.Id("p_proc_info__translate_count")).GetAttribute("value"); //翻译字数
  1696. waitGetElementById(wait, "libase").Click();
  1697. var p_case_info__case_name = wait.Until((d) =>
  1698. {
  1699. try
  1700. {
  1701. return d.FindElement(By.Id("p_case_info__case_name"));
  1702. }
  1703. catch
  1704. {
  1705. return null;
  1706. }
  1707. });
  1708. //System.Threading.Thread.Sleep(500);
  1709. retObject.CaseName = p_case_info__case_name.GetAttribute("value"); //案件名称
  1710. retObject.CustomerName = driver.FindElement(By.Id("p_case_info__customer_id")).GetAttribute("value"); //客户名称
  1711. retObject.BusinessType = driver.FindElement(By.Id("p_case_info__business_type_id")).GetAttribute("value"); //业务类型
  1712. retObject.CaseState = GetSelectText(driver.FindElement(By.Id("p_case_info__case_status_id")));
  1713. retObject.ApplicationType = GetSelectText(driver.FindElement(By.Id("p_case_info__apply_type_id")));
  1714. retObject.CaseType = driver.FindElement(By.Id("p_case_info__case_type_id")).GetAttribute("value"); //案件类型
  1715. retObject.EntrustingDate = driver.FindElement(By.Id("p_case_info__charge_date")).GetAttribute("value"); //委案日期
  1716. retObject.CaseMemo = driver.FindElement(By.Id("p_case_info__remark")).GetAttribute("value"); //案件备注
  1717. //driver.FindElement(By.XPath($"//span[contains(text(),'扩展信息')]")).Click();
  1718. //select[@id='p_case_info__case_coefficient_id']
  1719. //retObject.CaseCoefficient = GetSelectText(driver.FindElement(By.Id("p_case_info__case_coefficient_id")));
  1720. }
  1721. catch (Exception ex)
  1722. {
  1723. throw new Exception(ex.Message, ex);
  1724. }
  1725. finally
  1726. {
  1727. driver.Quit();
  1728. killChromProcess();
  1729. }
  1730. }
  1731. Service.Dispose();
  1732. }
  1733. return retObject;
  1734. }
  1735. private static void killChromProcess()
  1736. {
  1737. try
  1738. {
  1739. Process[] workers = Process.GetProcessesByName("Chrome");
  1740. foreach (Process worker in workers)
  1741. {
  1742. worker.Kill();
  1743. worker.WaitForExit();
  1744. worker.Dispose();
  1745. }
  1746. workers = Process.GetProcessesByName("Chromedriver");
  1747. foreach (Process worker in workers)
  1748. {
  1749. worker.Kill();
  1750. worker.WaitForExit();
  1751. worker.Dispose();
  1752. }
  1753. }
  1754. catch { }
  1755. }
  1756. private static string GetSelectText(IWebElement element)
  1757. {
  1758. var strValue = element.GetAttribute("value");
  1759. if (string.IsNullOrEmpty(strValue))
  1760. {
  1761. return null;
  1762. }
  1763. var ops = element.FindElements(By.TagName("option"));
  1764. foreach (var op in ops)
  1765. {
  1766. if (op.GetAttribute("value") == strValue)
  1767. {
  1768. return op.Text;
  1769. }
  1770. }
  1771. return null;
  1772. }
  1773. }
  1774. }