Python selenium,我怎样才能删除一个元素?

Posted

技术标签:

【中文标题】Python selenium,我怎样才能删除一个元素?【英文标题】:Python selenium, how can i delete an element? 【发布时间】:2014-04-26 05:42:49 【问题描述】:

我在最后一个小时一直在尝试删除一个元素,但没有成功。并且该元素只能通过类名访问。 我试过了:

js = "var aa=document.getElementsByClassName('classname')[0];aa.parentNode.removeChild(aa)"
driver.execute_script(js)

我收到错误提示 parentNode 未定义。

那么使用 Selenium 删除元素的最佳方法是什么?

【问题讨论】:

【参考方案1】:

感谢路易斯的意见。我使用您建议的 javascript 构建了以下 python 函数:

def excludeTagFromWebDriver(driver : WebDriver, selector : str):
    i = 0
    soup = BeautifulSoup(driver.page_source, 'html.parser') # Parsing content using beautifulsoup
    while soup.find(selector):
        # print(soup.find(selector))
        js = """
            var element = document.querySelector(""" + "'" + selector + "'" + """);
            if (element)
                element.parentNode.removeChild(element);
            """
        driver.execute_script(js)
        soup = BeautifulSoup(driver.page_source, 'html.parser') # Parsing content using beautifulsoup
        i += 1
        # print('Removed tag with selector ' + "'" + selector + "'" + ' with nr: ', i)
    print('Removed ' + str(i) + ' tags with the selector ' + "'" + selector + "'" + " and all it's children tags.")
    return driver

driver = excludeTagFromWebDriver(driver,"sup")

【讨论】:

【参考方案2】:

我不知道专门用于删除元素的 Selenium 方法。但是,您可以这样做:

element = driver.find_element_by_class_name('classname')
driver.execute_script("""
var element = arguments[0];
element.parentNode.removeChild(element);
""", element)

find_element_by_class_name 会在元素不存在时引发异常。因此,您不必测试 element 是否设置为合理值。如果方法返回,则设置它。然后将元素传回execute_script。在 Python 中传递给 execute_script 的参数在 JavaScript 中显示为 arguments 对象。 (它与您通常使用任何 JavaScript 函数获得的 arguments 对象相同。在幕后 Selenium 将 JavaScript 代码包装在一个匿名函数中。)

或者您可以使用依赖于 JavaScript 的解决方案来查找元素:

driver.execute_script("""
var element = document.querySelector(".classname");
if (element)
    element.parentNode.removeChild(element);
""")

如果您碰巧使用远程服务器来运行测试(如 Sauce Labs 或 BrowserStack),则此解决方案要好得多。 Selenium 客户端和服务器之间的通信成本不可忽略。

【讨论】:

【参考方案3】:

getElementByClassName 不是document 上的方法。你会想要使用

getElementsByClassName('classname')[0]...

但前提是您确定它是唯一具有该课程的人。

【讨论】:

哦,谢谢我也编辑了它,但关于如何删除元素的问题仍然存在:) 你的方法应该有效。如果 .parentNode 未定义,则 aa 不是节点(或者是主体标签或其他东西)。你添加[0]了吗? 我做了,然后添加了“要删除的对象”,现在它可以工作了,感谢您的帮助!

以上是关于Python selenium,我怎样才能删除一个元素?的主要内容,如果未能解决你的问题,请参考以下文章

我怎样才能给 Selenium Grid 中的会话无限的空闲时间,但清理断开连接的会话?

Python Selenium:发送密钥太慢

我怎样才能使这个 web3 python 脚本更快?

python selenium+ie 如何定位js生成的元素?

selenium3+python自动化9-JS增加删除修改HTML元素属性

在java中,我怎样才能删除一个sqlite表?