Python selenium,如何删除一个元素?
我花了一个小时想要删除一个元素,但一直没成功。这个元素只能通过类名来找到。
我试过以下代码:
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]...
不过,只有在你确定这是唯一一个有那个类的元素时,才可以这样做。