mirror of
https://github.com/Second-Hand-Friends/kleinanzeigen-bot.git
synced 2026-03-12 02:31:45 +01:00
fix: Setting correct shipping and package size in update mode (#690)
## ℹ️ Description This PR fixes the update logic for shipping options. A different dialog sequence is used in some categories which must be taken into account. Also the selection of the correct shipping sizes was refactured. - Link to the related issue(s): Issue #687 ## 📋 Changes Summary - An check was added if two dialogs have to be closed in update mode - Logic for setting package siz was refactured in update mode ### ⚙️ Type of Change Select the type(s) of change(s) included in this pull request: - [x] 🐞 Bug fix (non-breaking change which fixes an issue) - [ ] ✨ New feature (adds new functionality without breaking existing usage) - [ ] 💥 Breaking change (changes that might break existing user setups, scripts, or configurations) ## ✅ Checklist Before requesting a review, confirm the following: - [x] I have reviewed my changes to ensure they meet the project's standards. - [x] I have tested my changes and ensured that all tests pass (`pdm run test`). - [x] I have formatted the code (`pdm run format`). - [x] I have verified that linting passes (`pdm run lint`). - [x] I have updated documentation where necessary. By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Improved shipping-option handling when editing listings: the flow now more reliably navigates the shipping dialog, correctly selects or deselects options based on item size and the desired configuration, and avoids incorrect selections across size categories—resulting in more consistent shipping choices when modifying ads. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
@@ -1105,8 +1105,15 @@ class KleinanzeigenBot(WebScrapingMixin):
|
||||
except TimeoutError:
|
||||
await self.web_click(By.XPATH, '//dialog//button[contains(., "Zurück")]')
|
||||
|
||||
# in some categories we need to go another dialog back
|
||||
try:
|
||||
await self.web_find(By.XPATH, '//dialog//button[contains(., "Andere Versandmethoden")]',
|
||||
timeout=short_timeout)
|
||||
except TimeoutError:
|
||||
await self.web_click(By.XPATH, '//dialog//button[contains(., "Zurück")]')
|
||||
|
||||
await self.web_click(By.XPATH, '//dialog//button[contains(., "Andere Versandmethoden")]')
|
||||
await self.__set_shipping_options(ad_cfg)
|
||||
await self.__set_shipping_options(ad_cfg, mode)
|
||||
else:
|
||||
special_shipping_selector = '//select[contains(@id, ".versand_s")]'
|
||||
if await self.web_check(By.XPATH, special_shipping_selector, Is.DISPLAYED):
|
||||
@@ -1142,7 +1149,7 @@ class KleinanzeigenBot(WebScrapingMixin):
|
||||
LOG.debug(ex, exc_info = True)
|
||||
raise TimeoutError(_("Unable to close shipping dialog!")) from ex
|
||||
|
||||
async def __set_shipping_options(self, ad_cfg:Ad) -> None:
|
||||
async def __set_shipping_options(self, ad_cfg:Ad, mode:AdUpdateStrategy = AdUpdateStrategy.REPLACE) -> None:
|
||||
if not ad_cfg.shipping_options:
|
||||
return
|
||||
|
||||
@@ -1175,27 +1182,59 @@ class KleinanzeigenBot(WebScrapingMixin):
|
||||
shipping_size_radio_is_checked = hasattr(shipping_size_radio.attrs, "checked")
|
||||
|
||||
if shipping_size_radio_is_checked:
|
||||
# in the same size category all options are preselected, so deselect the unwanted ones
|
||||
unwanted_shipping_packages = [
|
||||
package for size, selector, package in shipping_options_mapping.values()
|
||||
if size == shipping_size and package not in shipping_packages
|
||||
]
|
||||
to_be_clicked_shipping_packages = unwanted_shipping_packages
|
||||
else:
|
||||
# in a different size category nothing is preselected, so select all we want
|
||||
await self.web_click(By.ID, f"radio-button-{shipping_radio_selector}")
|
||||
to_be_clicked_shipping_packages = list(shipping_packages)
|
||||
|
||||
await self.web_click(By.XPATH, '//dialog//button[contains(., "Weiter")]')
|
||||
|
||||
if mode == AdUpdateStrategy.MODIFY:
|
||||
# in update mode we cannot rely on any information and have to (de-)select every package
|
||||
LOG.debug("Using MODIFY mode logic for shipping options")
|
||||
|
||||
# get only correct size
|
||||
selected_size_shipping_packages = [
|
||||
package for size, selector, package in shipping_options_mapping.values()
|
||||
if size == shipping_size
|
||||
]
|
||||
LOG.debug("Processing %d packages for size '%s'", len(selected_size_shipping_packages), shipping_size)
|
||||
|
||||
for shipping_package in selected_size_shipping_packages:
|
||||
shipping_package_xpath = f'//dialog//input[contains(@data-testid, "{shipping_package}")]'
|
||||
shipping_package_checkbox = await self.web_find(By.XPATH, shipping_package_xpath)
|
||||
shipping_package_checkbox_is_checked = hasattr(shipping_package_checkbox.attrs, "checked")
|
||||
|
||||
LOG.debug(
|
||||
"Package '%s': checked=%s, wanted=%s",
|
||||
shipping_package,
|
||||
shipping_package_checkbox_is_checked,
|
||||
shipping_package in shipping_packages
|
||||
)
|
||||
|
||||
# select wanted packages if not checked already
|
||||
if shipping_package in shipping_packages:
|
||||
if not shipping_package_checkbox_is_checked:
|
||||
# select
|
||||
LOG.debug("Selecting package '%s'", shipping_package)
|
||||
await self.web_click(By.XPATH, shipping_package_xpath)
|
||||
# deselect unwanted if selected
|
||||
elif shipping_package_checkbox_is_checked:
|
||||
LOG.debug("Deselecting package '%s'", shipping_package)
|
||||
await self.web_click(By.XPATH, shipping_package_xpath)
|
||||
else:
|
||||
for shipping_package in to_be_clicked_shipping_packages:
|
||||
try:
|
||||
await self.web_click(
|
||||
By.XPATH,
|
||||
f'//dialog//input[contains(@data-testid, "{shipping_package}")]')
|
||||
except TimeoutError as ex:
|
||||
LOG.debug(ex, exc_info = True)
|
||||
|
||||
except TimeoutError as ex:
|
||||
LOG.debug(ex, exc_info = True)
|
||||
try:
|
||||
# Click apply button
|
||||
await self.web_click(By.XPATH, '//dialog//button[contains(., "Fertig")]')
|
||||
|
||||
Reference in New Issue
Block a user