fix: improve login detection with fallback element (#493)

- Add fallback check for user-email element when mr-medium is not found
- Improve login detection reliability
- Add test case for alternative login element
This commit is contained in:
Benedikt
2025-04-30 17:50:58 +02:00
committed by GitHub
parent 7852985de9
commit 8b2d61b1d4
3 changed files with 20 additions and 4 deletions

View File

@@ -540,11 +540,18 @@ class KleinanzeigenBot(WebScrapingMixin):
async def is_logged_in(self) -> bool:
try:
# Try to find the standard element first
user_info = await self.web_text(By.CLASS_NAME, "mr-medium")
if self.config["login"]["username"].lower() in user_info.lower():
return True
except TimeoutError:
return False
try:
# If standard element not found, try the alternative
user_info = await self.web_text(By.ID, "user-email")
if self.config["login"]["username"].lower() in user_info.lower():
return True
except TimeoutError:
return False
return False
async def delete_ads(self, ad_cfgs:list[tuple[str, dict[str, Any], dict[str, Any]]]) -> None:

View File

@@ -151,7 +151,7 @@ class TestAdExtractorShipping:
@pytest.mark.asyncio
# pylint: disable=protected-access
async def test_extract_shipping_info_with_all_matching_options(self, test_extractor: AdExtractor) -> None:
async def test_extract_shipping_info_with_all_matching_options(self, test_extractor:AdExtractor) -> None:
"""Test shipping info extraction with all matching options enabled."""
shipping_response = {
"content": json.dumps({
@@ -185,7 +185,7 @@ class TestAdExtractorShipping:
@pytest.mark.asyncio
# pylint: disable=protected-access
async def test_extract_shipping_info_with_excluded_options(self, test_extractor: AdExtractor) -> None:
async def test_extract_shipping_info_with_excluded_options(self, test_extractor:AdExtractor) -> None:
"""Test shipping info extraction with excluded options."""
shipping_response = {
"content": json.dumps({
@@ -222,7 +222,7 @@ class TestAdExtractorShipping:
@pytest.mark.asyncio
# pylint: disable=protected-access
async def test_extract_shipping_info_with_excluded_matching_option(self, test_extractor: AdExtractor) -> None:
async def test_extract_shipping_info_with_excluded_matching_option(self, test_extractor:AdExtractor) -> None:
"""Test shipping info extraction when the matching option is excluded."""
shipping_response = {
"content": json.dumps({

View File

@@ -324,6 +324,15 @@ class TestKleinanzeigenBotAuthentication:
with patch.object(configured_bot, "web_text", return_value = "Welcome testuser"):
assert await configured_bot.is_logged_in() is True
@pytest.mark.asyncio
async def test_is_logged_in_returns_true_with_alternative_element(self, configured_bot:KleinanzeigenBot) -> None:
"""Verify that login check returns true when logged in with alternative element."""
with patch.object(configured_bot, "web_text", side_effect = [
TimeoutError(), # First try with mr-medium fails
"angemeldet als: testuser" # Second try with user-email succeeds
]):
assert await configured_bot.is_logged_in() is True
@pytest.mark.asyncio
async def test_is_logged_in_returns_false_when_not_logged_in(self, configured_bot:KleinanzeigenBot) -> None:
"""Verify that login check returns false when not logged in."""