웹페이지가 화면요소가 없는 경웁checkbox 클릭오류 수정
This commit is contained in:
		| @@ -8,6 +8,7 @@ using WebDriverManager; | ||||
| using WebDriverManager.DriverConfigs.Impl; | ||||
| using System.IO; | ||||
| using System.Runtime.InteropServices; | ||||
| using System.Threading; | ||||
|  | ||||
| namespace BokBonCheck | ||||
| { | ||||
| @@ -18,29 +19,32 @@ namespace BokBonCheck | ||||
|             SiteName = "남구통합도서관(문화정보도서관)"; // 문화관 검색기 | ||||
|         } | ||||
|  | ||||
|         protected override void SelectLibrary(WebDriverWait wait) | ||||
|         protected override bool SelectLibrary(WebDriverWait wait) | ||||
|         { | ||||
|             IWebElement searchBox = null; | ||||
|             try | ||||
|             { | ||||
|                 var selector = "#clickAll"; | ||||
|                 searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector))); | ||||
|                 if (searchBox != null && searchBox.Selected == true) | ||||
|                 if (searchBox == null) return false; | ||||
|                 if (searchBox.Selected == true) | ||||
|                 { | ||||
|                     searchBox.Click(); // 전체체크박스가 체크되어 있으면 클릭해서 해제 | ||||
|                     SafeClick(searchBox); | ||||
|                 } | ||||
|                 else return; | ||||
|  | ||||
|                 selector = "#libMA"; | ||||
|                 searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector))); | ||||
|                 if (searchBox != null && searchBox.Selected == false) | ||||
|                 if (searchBox == null) return false; | ||||
|                 if (searchBox.Selected == false) | ||||
|                 { | ||||
|                     searchBox.Click(); // 문화관 체크박스 선택 | ||||
|                     SafeClick(searchBox); | ||||
|                 } | ||||
|  | ||||
|                 return true; | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|  | ||||
|                 return false; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @@ -51,29 +55,32 @@ namespace BokBonCheck | ||||
|             SiteName = "남구통합도서관(푸른길도서관)"; | ||||
|         } | ||||
|  | ||||
|         protected override void SelectLibrary(WebDriverWait wait) | ||||
|         protected override bool SelectLibrary(WebDriverWait wait) | ||||
|         { | ||||
|             IWebElement searchBox = null; | ||||
|             try | ||||
|             { | ||||
|                 var selector = "#clickAll"; | ||||
|                 searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector))); | ||||
|                 if (searchBox != null && searchBox.Selected == true) | ||||
|                 if (searchBox == null) return false; | ||||
|                 if (searchBox.Selected == true) | ||||
|                 { | ||||
|                     searchBox.Click(); // 전체체크박스가 체크되어 있으면 클릭해서 해제 | ||||
|                     SafeClick(searchBox); | ||||
|                 } | ||||
|                 else return; | ||||
|  | ||||
|                 selector = "#libMB"; | ||||
|                 searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector))); | ||||
|                 if (searchBox != null && searchBox.Selected == false) | ||||
|                 if (searchBox == null) return false; | ||||
|                 if (searchBox.Selected == false) | ||||
|                 { | ||||
|                     searchBox.Click(); //  체크박스 선택 | ||||
|                     SafeClick(searchBox); | ||||
|                 } | ||||
|  | ||||
|                 return true; | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|  | ||||
|                 return false; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @@ -84,29 +91,35 @@ namespace BokBonCheck | ||||
|             SiteName = "남구통합도서관(청소년도서관)"; | ||||
|         } | ||||
|  | ||||
|         protected override void SelectLibrary(WebDriverWait wait) | ||||
|         protected override bool SelectLibrary(WebDriverWait wait) | ||||
|         { | ||||
|             IWebElement searchBox = null; | ||||
|             try | ||||
|             { | ||||
|                 var selector = "#clickAll"; | ||||
|                 searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector))); | ||||
|                 if (searchBox != null && searchBox.Selected == true) | ||||
|                 if (searchBox == null) return false; | ||||
|                 if (searchBox.Selected == true) | ||||
|                 { | ||||
|                     searchBox.Click(); // 전체체크박스가 체크되어 있으면 클릭해서 해제 | ||||
|                     SafeClick(searchBox); | ||||
|  | ||||
|                 } | ||||
|                 else return; | ||||
|  | ||||
|                 selector = "#libMC"; | ||||
|                 searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector))); | ||||
|                 if (searchBox != null && searchBox.Selected == false) | ||||
|                 if (searchBox == null) return false; | ||||
|                 if (searchBox.Selected == false) | ||||
|                 { | ||||
|                     searchBox.Click(); //  체크박스 선택 | ||||
|                 } | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|                     //searchBox.Click(); //  체크박스 선택 | ||||
|                     SafeClick(searchBox); | ||||
|  | ||||
|                 } | ||||
|                 return true; | ||||
|             } | ||||
|             catch(Exception ex) | ||||
|             { | ||||
|                 Console.WriteLine(ex.Message); | ||||
|                 return false; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @@ -117,29 +130,34 @@ namespace BokBonCheck | ||||
|             SiteName = "남구통합도서관(효천어울림도서관)"; | ||||
|         } | ||||
|  | ||||
|         protected override void SelectLibrary(WebDriverWait wait) | ||||
|       | ||||
|         protected override bool SelectLibrary(WebDriverWait wait) | ||||
|         { | ||||
|             IWebElement searchBox = null; | ||||
|             try | ||||
|             { | ||||
|                 var selector = "#clickAll"; | ||||
|                 searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector))); | ||||
|                 if (searchBox != null && searchBox.Selected == true) | ||||
|                 if (searchBox == null) return false; | ||||
|                 if (searchBox.Selected == true) | ||||
|                 { | ||||
|                     searchBox.Click(); // 전체체크박스가 체크되어 있으면 클릭해서 해제 | ||||
|                     SafeClick(searchBox); | ||||
|                 } | ||||
|                 else return; | ||||
|  | ||||
|  | ||||
|                 selector = "#libSW"; | ||||
|                 searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector))); | ||||
|                 if (searchBox != null && searchBox.Selected == false) | ||||
|                 if (searchBox == null) return false; | ||||
|                 if (searchBox.Selected == false) | ||||
|                 { | ||||
|                     searchBox.Click(); //  체크박스 선택 | ||||
|                     SafeClick(searchBox); | ||||
|                 } | ||||
|  | ||||
|                 return true; | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|  | ||||
|                 return false; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @@ -150,29 +168,33 @@ namespace BokBonCheck | ||||
|             SiteName = "남구통합도서관(스마트도서관)"; | ||||
|         } | ||||
|  | ||||
|         protected override void SelectLibrary(WebDriverWait wait) | ||||
|         protected override bool SelectLibrary(WebDriverWait wait) | ||||
|         { | ||||
|             IWebElement searchBox = null; | ||||
|             try | ||||
|             { | ||||
|                 var selector = "#clickAll"; | ||||
|                 searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector))); | ||||
|                 if (searchBox != null && searchBox.Selected == true) | ||||
|                 if (searchBox == null) return false; | ||||
|                 if ( searchBox.Selected == true) | ||||
|                 { | ||||
|                     searchBox.Click(); // 전체체크박스가 체크되어 있으면 클릭해서 해제 | ||||
|                     SafeClick(searchBox); | ||||
|                 } | ||||
|                 else return; | ||||
|                | ||||
|  | ||||
|                 selector = "#libSQ"; | ||||
|                 searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector))); | ||||
|                 if (searchBox != null && searchBox.Selected == false) | ||||
|                 if (searchBox == null) return false; | ||||
|                 if (searchBox.Selected == false) | ||||
|                 { | ||||
|                     searchBox.Click(); //  체크박스 선택 | ||||
|                     SafeClick(searchBox); | ||||
|                 } | ||||
|  | ||||
|                 return true; | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|  | ||||
|                 return false; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @@ -238,22 +260,62 @@ namespace BokBonCheck | ||||
|         } | ||||
|  | ||||
|  | ||||
|         virtual protected void SelectLibrary(WebDriverWait wait) | ||||
|         virtual protected bool SelectLibrary(WebDriverWait wait) | ||||
|         { | ||||
|             IWebElement searchBox = null; | ||||
|             try | ||||
|             { | ||||
|                 var selector = "#clickAll"; | ||||
|                 searchBox = wait.Until(d => d.FindElement(By.CssSelector(selector))); | ||||
|                 if (searchBox != null && searchBox.Selected == false) | ||||
|                 if (searchBox == null) return false; | ||||
|                 if (searchBox.Selected == false) | ||||
|                 { | ||||
|                     searchBox.Click(); // 전체체크박스가 해제되어 있으면 클릭해서 선택 | ||||
|                     SafeClick(searchBox); | ||||
|                 } | ||||
|                 else return; | ||||
|                 return true; | ||||
|             } | ||||
|             catch (Exception ex) | ||||
|             { | ||||
|                 Console.WriteLine(ex.Message); | ||||
|                 return false; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         protected void SafeClick(IWebElement searchBox) | ||||
|         { | ||||
|             // 안정적인 클릭을 위한 여러 방법 시도 | ||||
|             try | ||||
|             { | ||||
|                 // 1. JavaScript로 클릭 시도 | ||||
|                 var driver = ((IWrapsDriver)searchBox).WrappedDriver; | ||||
|                 ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click();", searchBox); | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|  | ||||
|                 try | ||||
|                 { | ||||
|                     // 2. 요소가 보이도록 스크롤 후 클릭 | ||||
|                     var driver = ((IWrapsDriver)searchBox).WrappedDriver; | ||||
|                     ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].scrollIntoView(true);", searchBox); | ||||
|                     Thread.Sleep(500); | ||||
|                     searchBox.Click(); | ||||
|                 } | ||||
|                 catch | ||||
|                 { | ||||
|                     try | ||||
|                     { | ||||
|                         // 3. Actions 클래스 사용 | ||||
|                         var driver = ((IWrapsDriver)searchBox).WrappedDriver; | ||||
|                         var actions = new OpenQA.Selenium.Interactions.Actions(driver); | ||||
|                         actions.MoveToElement(searchBox).Click().Perform(); | ||||
|                     } | ||||
|                     catch | ||||
|                     { | ||||
|                         // 4. 마지막 방법: JavaScript로 직접 체크 해제 | ||||
|                         var driver = ((IWrapsDriver)searchBox).WrappedDriver; | ||||
|                         ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].checked = false;", searchBox); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @@ -285,7 +347,13 @@ namespace BokBonCheck | ||||
|                 //} | ||||
|  | ||||
|                 //대상도서관 선택 | ||||
|                 SelectLibrary(wait); | ||||
|                 if(SelectLibrary(wait)==false) | ||||
|                 { | ||||
|                     result.ErrorMessage = "도서관선택실패"; | ||||
|                     result.BookCount = -1; | ||||
|                     result.IsSuccess = false; | ||||
|                     return result; | ||||
|                 } | ||||
|  | ||||
|                 // 검색창 찾기 (남구통합도서관 사이트의 특정 선택자 사용) | ||||
|                 IWebElement searchBox = null; | ||||
| @@ -453,6 +521,7 @@ namespace BokBonCheck | ||||
|             } | ||||
|         } | ||||
|  | ||||
|          | ||||
|  | ||||
|         // 페이지 변경을 감지하는 메서드 | ||||
|         public async Task WaitForPageChange(WebDriverWait wait) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 SeungHo Yang
					SeungHo Yang