웹페이지가 화면요소가 없는 경웁checkbox 클릭오류 수정

This commit is contained in:
SeungHo Yang
2025-07-09 23:25:42 +09:00
parent 12d6c2dbfb
commit 9be6834d9f

View File

@@ -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)