久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

如何在使用 cssSelector 清除 Chrome 瀏覽器的瀏覽數(shù)

How to interact with the elements within #shadow-root (open) while Clearing Browsing Data of Chrome Browser using cssSelector(如何在使用 cssSelector 清除 Chrome 瀏覽器的瀏覽數(shù)據(jù)時與 #shadow-root (open) 中的元素進(jìn)行交互
本文介紹了如何在使用 cssSelector 清除 Chrome 瀏覽器的瀏覽數(shù)據(jù)時與 #shadow-root (open) 中的元素進(jìn)行交互的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!

問題描述

我一直在關(guān)注

使用

注意:我們將參考圖片中顯示的術(shù)語.所以請仔細(xì)閱讀圖片以便更好地理解.

解決方案:

為了使用 shadow element,首先我們必須找到 shadow dom 附加到的 shadow host.下面是基于shadowHost獲取shadow root的簡單方法.

私有靜態(tài) WebElement getShadowRoot(WebDriver driver,WebElement shadowHost) {JavascriptExecutor js = (JavascriptExecutor) 驅(qū)動程序;return (WebElement) js.executeScript("return arguments[0].shadowRoot", shadowHost);}

然后您可以使用 shadowRoot 元素訪問陰影樹元素.

//使用 findElement 獲取原始 dom 中的 shadowHostWebElement shadowHost = driver.findElement(By.cssSelector("shadowHost_CSS"));//獲取影子根WebElement shadowRoot = getShadowRoot(driver,shadowHost);//訪問影子樹元素WebElement shadowTreeElement = shadowRoot.findElement(By.cssSelector("shadow_tree_element_css"));

為了簡化上述所有步驟,創(chuàng)建了以下方法.

public static WebElement getShadowElement(WebDriver driver,WebElement shadowHost, String cssOfShadowElement) {WebElement shardowRoot = getShadowRoot(驅(qū)動程序,shadowHost);返回 shardowRoot.findElement(By.cssSelector(cssOfShadowElement));}

現(xiàn)在你可以通過單一的方法調(diào)用來獲取 shadowTree 元素

WebElement shadowHost = driver.findElement(By.cssSelector("shadowHost_CSS_Goes_here));WebElement shadowTreeElement = getShadowElement(driver,shadowHost,"shadow_tree_element_css");

并像往常一樣執(zhí)行.click().getText()等操作.

shadowTreeElement.click()

當(dāng)您只有一層影子 DOM 時,這看起來很簡單.但是在這里,在這種情況下,我們有多個級別的 shadow dom.所以我們必須通過到達(dá)每個影子主機(jī)和根來訪問元素.

以下是使用上述方法(getShadowElement 和 getShadowRoot)的片段

//在當(dāng)前dom上定位shadowHostWebElement shadowHostL1 = driver.findElement(By.cssSelector("settings-ui"));//現(xiàn)在通過遍歷所有陰影級別來定位 shadowElementWebElement shadowElementL1 = getShadowElement(driver, shadowHostL1, "settings-main");WebElement shadowElementL2 = getShadowElement(driver, shadowElementL1,"settings-basic-page");WebElement shadowElementL3 = getShadowElement(driver, shadowElementL2,"settings-section > settings-privacy-page");WebElement shadowElementL4 = getShadowElement(driver, shadowElementL3,"settings-clear-browsing-data-dialog");WebElement shadowElementL5 = getShadowElement(driver, shadowElementL4,"#clearBrowsingDataDialog");WebElement clearData = shadowElementL5.findElement(By.cssSelector("#clearBrowsingDataConfirm"));System.out.println(clearData.getText());clearData.click();

您可以在答案開頭提到的單個js調(diào)用中實(shí)現(xiàn)上述所有步驟(在下面添加只是為了減少混淆).

WebElement clearData = (WebElement) js.executeScript("return document.querySelector('settings-ui').shadowRoot.querySelector('settings-main').shadowRoot.querySelector('settings-basic-page').shadowRoot.querySelector('settings-section > settings-privacy-page').shadowRoot.querySelector('settings-clear-browsing-data-dialog').shadowRoot.querySelector('#clearBrowsingDataDialog').querySelector('#clearBrowsingDataConfirm')");

截圖:

I had been following the discussion How to automate shadow DOM elements using selenium? to work with #shadow-root (open) elements.

While in the process of locating the Clear data button within the Clear browsing data popup, which appears while accessing the url chrome://settings/clearBrowserData through Selenium I am unable to locate the following element:

#shadow-root (open)
<settings-privacy-page>

Snapshot:

Using Selenium following are my code trials and the associated errors encountered:

  • Attempt 1:

    WebElement root5 = shadow_root4.findElement(By.tagName("settings-privacy-page"));
    

    • Error:

      Exception in thread "main" org.openqa.selenium.JavascriptException: javascript error: b.getElementsByTagName is not a function
      

  • Attempt 2:

    WebElement root5 = shadow_root4.findElement(By.cssSelector("settings-privacy-page"));
    

    • Error:

      Exception in thread "main" org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"css selector","selector":"settings-privacy-page"}
      

  • Attempt 3:

    WebElement root5 = (WebElement)((JavascriptExecutor)shadow_root4).executeScript("return document.getElementsByTagName('settings-privacy-page')[0]");
    

    • Error:

      Exception in thread "main" java.lang.ClassCastException: org.openqa.selenium.remote.RemoteWebElement cannot be cast to org.openqa.selenium.JavascriptExecutor
      

Incase if it is helpful the initial code block (till the above line) works perfect:

driver.get("chrome://settings/clearBrowserData");
WebElement root1 = driver.findElement(By.tagName("settings-ui"));
WebElement shadow_root1 = expand_shadow_element(root1);

WebElement root2 = shadow_root1.findElement(By.cssSelector("settings-main#main"));
WebElement shadow_root2 = expand_shadow_element(root2);

WebElement root3 = shadow_root2.findElement(By.cssSelector("settings-basic-page[role='main']"));
WebElement shadow_root3 = expand_shadow_element(root3);

WebElement root4 = shadow_root3.findElement(By.cssSelector("settings-section[page-title='Privacy and security']"));
WebElement shadow_root4 = expand_shadow_element(root4);

PS: expand_shadow_element() works flawless.

解決方案

If you are trying to get 'Clear Data' element then you can use the below js to get the element and then perform.

return document.querySelector('settings-ui').shadowRoot.querySelector('settings-main').shadowRoot.querySelector('settings-basic-page').shadowRoot.querySelector('settings-section > settings-privacy-page').shadowRoot.querySelector('settings-clear-browsing-data-dialog').shadowRoot.querySelector('#clearBrowsingDataDialog').querySelector('#clearBrowsingDataConfirm')

Here is the sample script.

driver.get("chrome://settings/clearBrowserData");
driver.manage().window().maximize();
JavascriptExecutor js = (JavascriptExecutor) driver; 
WebElement clearData = (WebElement) js.executeScript("return document.querySelector('settings-ui').shadowRoot.querySelector('settings-main').shadowRoot.querySelector('settings-basic-page').shadowRoot.querySelector('settings-section > settings-privacy-page').shadowRoot.querySelector('settings-clear-browsing-data-dialog').shadowRoot.querySelector('#clearBrowsingDataDialog').querySelector('#clearBrowsingDataConfirm')");
// now you can click on clear data button
clearData.click();

Edit 2: Explanation

Problem: Selenium does not provide explicit support to work with Shadow DOM elements, as they are not in the current dom. That's the reason why we will get NoSuchElementException exception when try to access the elements in the shadow dom.

Shadow DOM:

Note: We will be referring to the terms shown in the picture. So please go through the picture for better understanding.

Solution:

In order to work with shadow element first we have to find the shadow host to which the shadow dom is attached. Here is the simple method to get the shadow root based on the shadowHost.

private static WebElement getShadowRoot(WebDriver driver,WebElement shadowHost) {
    JavascriptExecutor js = (JavascriptExecutor) driver;
    return (WebElement) js.executeScript("return arguments[0].shadowRoot", shadowHost);
}

And then you can access the shadow tree element using the shadowRoot Element.

// get the shadowHost in the original dom using findElement
WebElement shadowHost = driver.findElement(By.cssSelector("shadowHost_CSS"));
// get the shadow root
WebElement shadowRoot = getShadowRoot(driver,shadowHost);
// access shadow tree element
WebElement shadowTreeElement = shadowRoot.findElement(By.cssSelector("shadow_tree_element_css"));

In order to simplify all the above steps created the below method.

public static WebElement getShadowElement(WebDriver driver,WebElement shadowHost, String cssOfShadowElement) {
    WebElement shardowRoot = getShadowRoot(driver, shadowHost);
    return shardowRoot.findElement(By.cssSelector(cssOfShadowElement));
}

Now you can get the shadowTree Element with single method call

WebElement shadowHost = driver.findElement(By.cssSelector("shadowHost_CSS_Goes_here));
WebElement shadowTreeElement = getShadowElement(driver,shadowHost,"shadow_tree_element_css");

And perform the operations as usual like .click(), .getText().

shadowTreeElement.click()

This Looks simple when you have only one level of shadow DOM. But here, in this case we have multiple levels of shadow doms. So we have to access the element by reaching each shadow host and root.

Below is the snippet using the methods that mentioned above (getShadowElement and getShadowRoot)

// Locate shadowHost on the current dom
WebElement shadowHostL1 = driver.findElement(By.cssSelector("settings-ui"));

// now locate the shadowElement by traversing all shadow levels
WebElement shadowElementL1 = getShadowElement(driver, shadowHostL1, "settings-main");
WebElement shadowElementL2 = getShadowElement(driver, shadowElementL1,"settings-basic-page");
WebElement shadowElementL3 = getShadowElement(driver, shadowElementL2,"settings-section > settings-privacy-page");
WebElement shadowElementL4 = getShadowElement(driver, shadowElementL3,"settings-clear-browsing-data-dialog");
WebElement shadowElementL5 = getShadowElement(driver, shadowElementL4,"#clearBrowsingDataDialog");
WebElement clearData = shadowElementL5.findElement(By.cssSelector("#clearBrowsingDataConfirm"));
System.out.println(clearData.getText());
clearData.click();

You can achieve all the above steps in single js call as at mentioned at the beginning of the answer (added below just to reduce the confusion).

WebElement clearData = (WebElement) js.executeScript("return document.querySelector('settings-ui').shadowRoot.querySelector('settings-main').shadowRoot.querySelector('settings-basic-page').shadowRoot.querySelector('settings-section > settings-privacy-page').shadowRoot.querySelector('settings-clear-browsing-data-dialog').shadowRoot.querySelector('#clearBrowsingDataDialog').querySelector('#clearBrowsingDataConfirm')");

Screenshot:

這篇關(guān)于如何在使用 cssSelector 清除 Chrome 瀏覽器的瀏覽數(shù)據(jù)時與 #shadow-root (open) 中的元素進(jìn)行交互的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!

【網(wǎng)站聲明】本站部分內(nèi)容來源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

How to wrap text around components in a JTextPane?(如何在 JTextPane 中的組件周圍環(huán)繞文本?)
MyBatis, how to get the auto generated key of an insert? [MySql](MyBatis,如何獲取插入的自動生成密鑰?[MySql])
Inserting to Oracle Nested Table in Java(在 Java 中插入 Oracle 嵌套表)
Java: How to insert CLOB into oracle database(Java:如何將 CLOB 插入 oracle 數(shù)據(jù)庫)
Why does Spring-data-jdbc not save my Car object?(為什么 Spring-data-jdbc 不保存我的 Car 對象?)
Use threading to process file chunk by chunk(使用線程逐塊處理文件)
主站蜘蛛池模板: 新91| 黄色免费在线网址 | 亚洲精品一区二区三区在线观看 | 草草草久久久 | 久久人体视频 | 秋霞电影一区二区三区 | 日韩在线精品视频 | 婷婷色在线播放 | 午夜精品一区二区三区在线观看 | 久久精品亚洲欧美日韩久久 | 一级特黄色毛片 | 91成人精品视频 | 国产色婷婷精品综合在线手机播放 | 色偷偷人人澡人人爽人人模 | 成人在线一级片 | 国产探花在线精品一区二区 | 国产精品一区二区三区在线 | 精品久久久久久久久久久久 | caoporon| 欧美久久久久久 | 成人欧美一区二区三区色青冈 | 国产一区二区三区精品久久久 | 亚洲在线免费 | 91精品久久久久久久久久 | 在线a视频 | 一区二区三区网站 | 一区二区三区高清 | 亚洲成人精品久久 | 国产欧美精品一区二区 | 在线视频日韩 | 成年人在线观看 | aa级毛片毛片免费观看久 | 成人免费在线播放视频 | 欧美一级毛片在线播放 | 成人免费网站 | 欧美日韩久久久 | 99久久婷婷国产亚洲终合精品 | 中文字幕日韩一区 | 久久精品成人一区 | 国产在线精品一区二区三区 | 亚洲高清在线观看 |