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+ie 如何定位js生成的元素?