1

I'm trying to develop a bot that automatically handles the deletion of various posts from a website. I have stumbled across a major problem which does not allow me to proceed any further.

The page I've achieved to open presents various checkboxes with the following input:

<input type="checkbox" name="ids[]" value="305664759" onclick="toggleDeleteButtons()">

What I have to do is check simultaneously each checkbox and then click on delete button. Then a popup will appear, where I have to click another "Delete" button with the following input:

<input id="btnDelAds" class="button" href="javascript:void(0)" onclick="document.manageads.cmd.value='del';if (submit_batch_delete()){document.manageads.submit();}else{closeDialogDelete();}">

And then another popup will appear for confirming, but that's another problem. In fact, the troubles come when I try to find the checkboxes.

This is the code for handling the first part of the site, and findind the checkboxes:

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys

#HANDLING ACCESS
email = "somemail"
password = "somepass"
driver = webdriver.Firefox()
driver.get("https://www.somesite.it/account/manageads")
login_field = driver.find_element_by_id("login_email")
login_field.clear()
login_field.send_keys(email)
login_field = driver.find_element_by_id("login_passwd")
login_field.clear()
login_field.send_keys(password)
login_field.send_keys(Keys.ENTER)

#HANDLING DELETE OF POSTS
while True:
    try:
        elem = driver.find_element_by_xpath("//input[@type='checkbox' and contains(@name, 'id')")
        print("Found")
    except NoSuchElementException:
        print("End")
        break
    elem.click()

(I've censored site url and credentials)

print("Found") clause is obviously not executed. The idea was to check consecutively every checkbox, probably I've done this in the wrong way.

What I get instead is "END" in console. Any help will be strongly appreciated. Thanks in advance.

King Powa
  • 441
  • 3
  • 9

1 Answers1

1

To trigger the presence of the popup with text as Delete you have to induce WebDriverWait for the desired element_to_be_clickable() and you can use either of the following Locator Strategies:

  • Using CSS_SELECTOR:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[name^='ids'][onclick^='toggleDeleteButtons'][type='checkbox']"))).click()
    
  • Using XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[starts-with(@name, 'ids') and starts-with(@onclick, 'toggleDeleteButtons')][@type='checkbox']"))).click()
    
  • Note : You have to add the following imports :

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

You can find a relevant discussion in How to locate a button with a dynamicID

undetected Selenium
  • 183,867
  • 41
  • 278
  • 352
  • I will try it and let you know. However, the popup must be triggered only after checking all checkboxes related to the posts. – King Powa Sep 01 '19 at 09:39
  • 1
    @KingPowa _check simultaneously each checkbox_ Relevant HTML please? – undetected Selenium Sep 01 '19 at 09:49
  • first of all thank for you patience. I posted the HTML releated to each checkbox in the first post. They all appear with this template: ``. If you wish, I can post an image of the checkboxes. I took this chuck of code from source code of the page, – King Powa Sep 01 '19 at 11:11