简体   繁体   English

无法从浏览器的本地存储中删除项目

[英]Can not delete item from local storage in browser

I am developing automated tests using Selenium in Java.我正在 Java 中使用 Selenium 开发自动化测试。 I want to delete local and session storage, cookies etc. to have "clear" WebDriver.我想删除本地和会话存储、cookie 等以“清除”WebDriver。 I need it to logout from the site and use the same WebDriver for all tests instead of closing and opening browser for each test case.我需要它从站点注销并为所有测试使用相同的 WebDriver,而不是为每个测试用例关闭和打开浏览器。

When I delete the whole local storage as is shown on the picture - it is deleted.当我删除如图所示的整个本地存储时 - 它被删除。 Then I reload the page.然后我重新加载页面。 I am not logged out and all local storage items appear again.我没有注销,所有本地存储项目再次出现。

在此处输入图片说明

Then I delete only active_user_session item using 'delete' key on keyboard.然后我使用键盘上的“删除”键仅删除 active_user_session 项目。 Then I immediately find myself logged out.然后我立即发现自己退出了。

This is strange thing... Why when I delete all storage I am not logged out and information was restored when I reload the page.这很奇怪......为什么当我删除所有存储时,我没有注销并且在我重新加载页面时恢复了信息。 But when I delete only one active_user_session item I was logged out immedeately???但是当我只删除一个 active_user_session 项目时,我立即注销了???

Ok.好的。 Let's go to the code.让我们来看看代码。

((JavascriptExecutor)(driver)).executeScript( String.format(
                "window.localStorage.removeItem('%s');", "access_token"
        ));

This one works fine.这个很好用。 But I need to delete active_user_session item it seems...但我需要删除 active_user_session 项目似乎......

((JavascriptExecutor)(driver)).executeScript( String.format(
                "window.localStorage.removeItem('%s');", "active_user_session"
        ));

This code does not work: active_user_session is still there!!!此代码不起作用:active_user_session 仍然存在!!!

The more funny thing:更搞笑的是:

    ((JavascriptExecutor)(driver)).executeScript(
            "window.localStorage.clear();"
    );

Deletes all except active_user_session item!删除除 active_user_session 项目之外的所有项目!

Whyy???为什么??? Can you explain please?你能解释一下吗? May be I don't know something... Thanks!可能是我不知道什么...谢谢!

Try using this尝试使用这个

 driver.getSessionStorage().clear();
 driver.getLocalStorage().clear();

for more information about this, you check the link有关这方面的更多信息,请查看链接

Try this - will clear everything from your browser the good old fashioned way - but completely automated otherwise (ie cookies, logins, etc. will all be requested again)...试试这个 - 将以老式的方式清除浏览器中的所有内容 - 但否则会完全自动化(即 cookie、登录等都将再次被请求)...

#https://stackoverflow.com/questions/54404721/can-not-delete-item-from-local-storage-in-browser/54415520#54415520
import time, os
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.common.exceptions import JavascriptException

def new_profile():
    global ev, parent, d, w
    global path_core, path_exec
    global ev


    path_core= os.path.join(os.path.expanduser("~"), 'Folder_Path_to_your_Code')
    path_exec =  os.path.join(path_core, "chromedriver.exe") #assumes chromedriver.exe saved in same location as your code...
    d = webdriver.Chrome(executable_path=path_exec)
    [ev] = [d.execute_script]
    parent = d.current_window_handle
    w = WebDriverWait(d,5)
    
    #d.implicitly_wait(0.5)
    print('new profile complete')


def browser_clear(url=''):
    global start, ss, w
    [ss] = [time.sleep]
    w_old, w = w, WebDriverWait(d, 20)
    url = d.current_url if url == ''else url 
    script0 = '''document.querySelector('body').querySelector('settings-ui')["shadowRoot"].querySelector('settings-main')['shadowRoot'].querySelector('settings-basic-page')['shadowRoot'].querySelector('settings-privacy-page')['shadowRoot'].querySelector('#pages').querySelector('#clearBrowsingData')['shadowRoot'].lastElementChild.click()'''
    script1 = '''document.querySelector('body').querySelector('settings-ui')["shadowRoot"].querySelector('settings-main')['shadowRoot'].querySelector('settings-basic-page')['shadowRoot'].querySelector('settings-privacy-page')['shadowRoot'].querySelector('settings-clear-browsing-data-dialog')['shadowRoot'].querySelector('iron-pages').querySelector('#basic-tab').querySelector('settings-dropdown-menu')['shadowRoot'].lastElementChild.selectedIndex = 4;'''
    script2 = '''document.querySelector('body').querySelector('settings-ui')["shadowRoot"].querySelector('settings-main')['shadowRoot'].querySelector('settings-basic-page')['shadowRoot'].querySelector('settings-privacy-page')['shadowRoot'].querySelector('settings-clear-browsing-data-dialog')['shadowRoot'].querySelector('#clearBrowsingDataDialog').children[3].lastElementChild.parentElement.children[2].click()'''
    script_wait = '''{if (document.querySelector('body').querySelector('settings-ui')["shadowRoot"].querySelector('settings-main')['shadowRoot'].querySelector('settings-basic-page')['shadowRoot'].querySelector('settings-privacy-page')['shadowRoot'].querySelector('settings-clear-browsing-data-dialog')) {return true} else {return false}}'''
    d.get('chrome://settings/')
    ev(script0)
    start = time.time()
    while (time.time() - start <= 30) and ev(script_wait) == False: ss(0.5)
    ss(1)
    ev(script1), ss(0.5), ev(script2)
    start = time.time()
    while (time.time() - start <= 180) and ev(script_wait) == True: ss(0.5)
    try:
        d.get(url)
    except TimeoutError:
        w.until(lambda x: x.execute_script("return document.readyState") == "complete")
    w = w_old
    d.get(url)


if __name__ == '__main__':
    new_profile()
    browser_clear()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM