Мне не удается отобразить ползунок на веб-сайте, связанном в вопросе, поэтому я предоставил решение, используя другой сайт с элементом ползунка (я предполагаю, что функциональность аналогична функциональности на Aliexpress веб-сайт).
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
# Instantiate objects
driver = webdriver.Chrome()
actions = ActionChains(driver)
# Load page and fill in input elements
driver.get("http://kthornbloom.com/slidetosubmit/")
driver.find_element(By.NAME, "name").send_keys("Fred")
driver.find_element(By.NAME, "email").send_keys("fred@example.com")
# Find slider elements
slider_container = driver.find_element(By.CSS_SELECTOR, ".slide-submit")
slider = driver.find_element(By.CSS_SELECTOR, ".slide-submit-thumb")
# Perform sliding action
actions.move_to_element(slider).click_and_hold().move_by_offset(slider_container.size['width'], 0).release().perform()
# Browser intentionally left open so that you can see what happened when the test was run!
Ключевой частью здесь является строка Perform sliding action
. Мы должны выделить два конкретных элемента:
- Элемент, который мы собираемся скользить
- Контейнер, содержащий этот элемент
Как только мы нашли оба этих элемента, мы используем класс actions, чтобы щелкнуть и удерживать элемент, который нам нужно сдвинуть, а затем передвинем его на ширину содержащего элемента вдоль оси x (как показано с помощью slider_container.size['width']
) , без изменения оси Y.
Это должно решить вашу проблему со скольжением, однако у вас будет другая проблема, вам нужно решить, был ли отображен слайдер или вы вошли на веб-сайт. Для этого вам понадобится ожидаемое условие, которое проверяет наличие 2 элементов:
- Слайдер.
- Элемент, который вы ожидаете увидеть после успешного входа в систему.
Если отображается элемент, который вы ожидаете увидеть при входе в систему, вам не нужно ничего делать. Если ползунок показан, вам нужно будет выполнить приведенную выше логику, чтобы переместить полосу.
* Редактировать *
Чтобы немного улучшить ситуацию, вы можете поместить скользящий код в ExpectedCondition следующим образом:
class wait_for_element_while_verifying_slider(object):
def __init__(self, locator, slider_container_locator, slider_locator):
self.locator = locator
self.slider_container_locator = slider_container_locator
self.slider_locator = slider_locator
def __call__(self, _driver):
try:
return _driver.find_element(*self.locator)
except (NoSuchElementException, StaleElementReferenceException):
container = _driver.find_elements(*self.slider_container_locator)
slider = _driver.find_elements(*self.slider_locator)
if len(container) > 0 and len(slider) > 0:
actions = ActionChains(_driver)
actions.move_to_element(slider[0]).click_and_hold().move_by_offset(container[0].size['width'], 0).release().perform()
return False
При этом будет выполнен поиск элемента, который вы ожидаете увидеть при входе в систему. Если элемент, который вы ожидаете увидеть при успешном входе в систему, не отображается, он попытается найти элементы ползунка и взаимодействовать с ними. с ними, чтобы обработать проверку слайдов. Обратите внимание, что, как только он попытается выполнить проверку слайдов, ожидаемое условие вернет значение False, что заставит его проверить, отображается ли ожидаемый вошедший в систему элемент снова.
Вы можете использовать его в своем коде так:
# Instantiate objects
driver = webdriver.Chrome()
wait = WebDriverWait(driver, 10)
# Load page and fill in input elements
driver.get("http://kthornbloom.com/slidetosubmit/")
driver.find_element(By.NAME, "name").send_keys("Fred")
driver.find_element(By.NAME, "email").send_keys("fred@example.com")
# Define slider elements and element that will be shown when you successfully log in
SLIDER_CONTAINER = (By.CSS_SELECTOR, ".slide-submit")
SLIDER = (By.CSS_SELECTOR, ".slide-submit-thumb")
ELEMENT_TO_FIND = (By.XPATH, "//div[.=\"Looks Like You're Human!\"]")
# Invoke the explicit wait that will deal with the slider if it is displayed
wait.until(wait_for_element_while_verifying_slider(ELEMENT_TO_FIND, SLIDER_CONTAINER, SLIDER))
В приведенном выше примере используется тот же пример веб-сайта, что и выше. Чтобы сделать это тайм-аут, вы можете изменить ELEMENT_TO_FIND
на то, что не существует. Чтобы он прошел без скольжения, вы можете изменить ELEMENT_TO_FIND
на:
ELEMENT_TO_FIND = (By.XPATH, "//div[.=\"Slide To Submit\"]")
Используя код, который вы указали в комментарии, я ожидаю, что на сайте aliexpress будет работать следующее:
# Define slider elements and element that will be shown when you successfully log in
SLIDER_CONTAINER = (By.CSS_SELECTOR, ".nc-lang-cnt")
SLIDER = (By.CSS_SELECTOR, ".nc_wrapper .btn_slide")
ELEMENT_TO_FIND = (By.ID, "search-key")
# Invoke the explicit wait that will deal with the slider if it is displayed
wait.until(wait_for_element_while_verifying_slider(ELEMENT_TO_FIND, SLIDER_CONTAINER, SLIDER))