Python selenium,如何删除一个元素?

28 投票
3 回答
44479 浏览
提问于 2025-04-17 23:01

我花了一个小时想要删除一个元素,但一直没成功。这个元素只能通过类名来找到。

我试过以下代码:

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

但是我收到一个错误,提示 parentNode 是未定义的。

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

3 个回答

3

谢谢你的建议,Louis。我写了一个Python函数,里面用了你提到的JavaScript代码:

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")
51

我不知道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客户端和服务器之间的通信是有一定成本的。

5

getElementByClassName 不是 document 的一个方法。你应该使用

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

不过,只有在你确定这是唯一一个有那个类的元素时,才可以这样做。

撰写回答