【问题标题】:How to locate a particulat checkbox from a series of checkboxes using Selenium and Python 3.7.4如何使用 Selenium 和 Python 3.7.4 从一系列复选框中定位特定复选框
【发布时间】:2019-09-01 19:14:18
【问题描述】:

我正在尝试开发一个自动处理从网站上删除各种帖子的机器人。我偶然发现了一个重大问题,无法继续进行下去。

我打开的页面显示了带有以下输入的各种复选框:

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

(我已经审查了网站网址和凭据)

print("Found") 子句显然没有被执行。这个想法是连续检查每个复选框,可能我以错误的方式完成了这个。

我得到的是控制台中的“END”。 任何帮助将不胜感激。提前致谢。

【问题讨论】:

    标签: python selenium xpath css-selectors webdriverwait


    【解决方案1】:

    要触发带有 Delete 文本的 popup 的存在,您必须为所需的element_to_be_clickable() 诱导 WebDriverWait 并且您可以使用以下任一Locator Strategies:

    • 使用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
      

    您可以在How to locate a button with a dynamicID找到相关讨论

    【讨论】:

    • 我会尝试并告诉你。但是,只有在选中与帖子相关的所有复选框后才能触发弹出窗口。
    • @KingPowa 同时检查每个复选框请提供相关的HTML?
    • 首先感谢您的耐心等待。我在第一篇文章中发布了与每个复选框相关的 HTML。它们都出现在这个模板中:&lt;input type="checkbox" name="ids[]" value="some_int_value" onclick="toggleDeleteButtons()"&gt;。如果您愿意,我可以发布复选框的图像。我从页面的源代码中获取了这段代码,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 2021-12-18
    • 2014-07-29
    相关资源
    最近更新 更多