Python Selenium not able to click on elements

Question:

I want to click on each product on aliexpress and do something with it.

However, I kept running into an ElementClickInterceptedException

Please verify that the code is correct before answering the question if you are using chat-GPT or any other AI to help with this problem.

These are the things that I tried

for supplier in suppliers:
    driver.execute_script("arguments[0].scrollIntoView();", supplier)
    actions = ActionChains(driver)
    actions.move_to_element(supplier).click().perform()

for supplier in suppliers:

    driver.execute_script("arguments[0].scrollIntoView();", supplier)
    actions = ActionChains(driver)
    actions.move_to_element(supplier)

    wait.until(EC.visibility_of_element_located((By.XPATH, ".//*[@class='list--gallery--34TropR']//span/a")))

    try:
        supplier.click()
    except ElementClickInterceptedException:
        print('object not on screen')

However, this still gives me the highest click-through-rate

for supplier in suppliers:
    try:
        supplier.click()
        print('Supplier clicked')
        time.sleep(1)
    except ElementClickInterceptedException:
        print('object not on screen')

This is how I initialized the driver and loaded the elements.


search_key = "Motor+toy+boat"

suppliers = []

print("https://www.aliexpress.com/premium/"+search_key+".html?spm=a2g0o.best.1000002.0&initiative_id=SB_20221218233848&dida=y")

# create a webdriver object and set the path to the Chrome driver
service = Service('../venv/chromedriver.exe')
driver = webdriver.Chrome(service=service)

# navigate to the Aliexpress website
driver.get("https://www.aliexpress.com/")

# Wait for the page to load
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.ID, "search-key")))

# wait for the page to load
driver.implicitly_wait(10)

driver.get("https://www.aliexpress.com/premium/"+search_key+".html?spm=a2g0o.best.1000002.0&initiative_id=SB_20221218233848&dida=y")

last_height = driver.execute_script("return document.body.scrollHeight")

while True:
    driver.execute_script("window.scrollBy(0, 800);")
    sleep(1)
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        print(new_height, last_height)
        break
    last_height = new_height

for element in driver.find_elements(By.XPATH, "//*[contains(@class, 'manhattan--container--1lP57Ag cards--gallery--2o6yJVt')]"):
    suppliers.append(element)
Asked By: Bryan

||

Answers:

Couple of issues I have identified.

  1. It is detecting bot, so after couple of runs it will stop identifying the element.Use --disable-blink-features in chrome options.
  2. Once you iterate the list,it is clicking somewhere else, just wait for a second and then click, it will work.

added code will click only visible element on the page, If you need to click more you needed to scroll the page and then click.

You can check the count of total visible element on the page.

from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
import time

chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("excludeSwitches", ['enable-automation'])
chrome_options.add_experimental_option('useAutomationExtension', False)
chrome_options.add_argument('--disable-blink-features=AutomationControlled')
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()),options=chrome_options)
driver.get("https://www.aliexpress.com/w/wholesale-uk.html")
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH, "//*[contains(@class, 'manhattan--container--1lP57Ag cards--gallery--2o6yJVt')]")).click()
suppliers=WebDriverWait(driver,10).until(EC.visibility_of_all_elements_located((By.XPATH,".//*[@class='list--gallery--34TropR']//span/a")))
print("Total visible element on the page: " + str(len(suppliers)))

for supplier in suppliers:
    time.sleep(1)
    supplier.click()
Answered By: KunduK