Как найти конкретный флажок из ряда флажков с помощью Selenium и Python 3.7.4

Я пытаюсь разработать бота, который автоматически обрабатывает удаление различных сообщений с веб-сайта. Я наткнулся на серьезную проблему, которая не позволяет мне двигаться дальше.

На странице, которую мне удалось открыть, представлены различные флажки со следующим вводом:

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

Что мне нужно сделать, так это одновременно установить каждый флажок, а затем нажать кнопку удаления. Затем появится всплывающее окно, в котором я должен нажать еще одну кнопку «Удалить» со следующим вводом:

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

Затем появится еще одно всплывающее окно для подтверждения, но это уже другая проблема. На самом деле проблемы возникают, когда я пытаюсь найти флажки.

Это код для обработки первой части сайта и поиска флажков:

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()

(Я подверг цензуре URL-адрес сайта и учетные данные)

Предложение print("Found") явно не выполняется. Идея заключалась в том, чтобы последовательно проверять все флажки, возможно, я сделал это неправильно.

Вместо этого я получаю "КОНЕЦ" в консоли. Любая помощь будет принята с благодарностью. Заранее спасибо.


person King Powa    schedule 31.08.2019    source источник


Ответы (1)


Чтобы вызвать появление всплывающего окна с текстом как Удалить, вы должны вызвать WebDriverWait для желаемого element_to_be_clickable(), и вы можете использовать любой из следующих Стратегии поиска:

  • Использование CSS_SELECTOR:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[name^='ids'][onclick^='toggleDeleteButtons'][type='checkbox']"))).click()
    
  • Использование 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()
    
  • Примечание. Вам необходимо добавить следующий импорт:

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

Вы можете найти соответствующее обсуждение в Как найти кнопку с dynamicID

person DebanjanB    schedule 31.08.2019
comment
Я попробую и дам вам знать. Однако всплывающее окно должно запускаться только после установки всех флажков, связанных с сообщениями. - person King Powa; 01.09.2019
comment
@KingPowa отметьте одновременно каждый флажок Соответствующий HTML, пожалуйста? - person DebanjanB; 01.09.2019
comment
прежде всего благодарю за терпение. Я разместил HTML-код для каждого флажка в первом посте. Все они появляются с этим шаблоном: <input type="checkbox" name="ids[]" value="some_int_value" onclick="toggleDeleteButtons()">. Если хотите, могу выложить изображение флажков. Я взял этот кусок кода из исходного кода страницы, - person King Powa; 01.09.2019