web-dev-qa-db-ja.com

Chrome Browser of cssSelectorを使用してブラウザデータを消去しているときに#shadow-root(open)内の要素を操作する方法

私はディスカッション セレンを使用してシャドウDOM要素を自動化する方法? を使用して#shadow-root (open)要素を操作していました。

を見つける過程で Clear data Clear browseing dataポップアップ内のボタン、URL _chrome://settings/clearBrowserData_からSelenium次の要素が見つかりません:

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

スナップショット:

settings-privacy-page

Selenium を使用すると、コードの試行とそれに関連するエラーが発生します。

  • 試み1:

    _WebElement root5 = shadow_root4.findElement(By.tagName("settings-privacy-page"));
    _
    • エラー:

      _Exception in thread "main" org.openqa.Selenium.JavascriptException: javascript error: b.getElementsByTagName is not a function
      _
  • 試み2:

    _WebElement root5 = shadow_root4.findElement(By.cssSelector("settings-privacy-page"));
    _
    • エラー:

      _Exception in thread "main" org.openqa.Selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"css selector","selector":"settings-privacy-page"}
      _
  • 試行3:

    _WebElement root5 = (WebElement)((JavascriptExecutor)shadow_root4).executeScript("return document.getElementsByTagName('settings-privacy-page')[0]");
    _
    • エラー:

      _Exception in thread "main" Java.lang.ClassCastException: org.openqa.Selenium.remote.RemoteWebElement cannot be cast to org.openqa.Selenium.JavascriptExecutor
      _

それが役立つ場合は、最初のコードブロック(上記の行まで)が完全に機能します。

_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()は問題なく動作します。

6
DebanjanB

chrome履歴の閲覧をクリアする必要がある同様のテストを実行する必要がありました。マイナーな違いは、ポップアップの詳細セクションに移動した後でデータをクリアすることでした。 「データのクリア」ボタンのみをクリックするために、1つまたは2つの階層要素を誤って見落としたことは確かです。あるいは、兄弟要素と親要素の間で混乱している可能性があります。コードを見ると、あなたはすでにそれを知っていると思います特定のシャドウDOM要素にアクセスするには、適切な順序付けが必要であり、上記でも非常にうまく説明されています。
今あなたの問題に取り組んでいます、これは正しく動作している私のコードスニペットです。コードはデータがクリーンアップされるまで待機し、次のアクションに進みます-

public WebElement expandRootElement(WebElement element) {
WebElement ele = (WebElement) ((JavascriptExecutor) driver).executeScript("return arguments[0].shadowRoot",
        element);
return ele;
}

public void clearBrowsingHistory() throws Exception {

    WebDriverWait wait = new WebDriverWait(driver, 15);
    driver.get("chrome://settings/clearBrowserData");
// Get shadow root elements
    WebElement shadowRoot1 = expandRootElement(driver.findElement(By.xpath("/html/body/settings-ui")));

    WebElement root2 = shadowRoot1.findElement(By.cssSelector("settings-main"));
    WebElement shadowRoot2 = expandRootElement(root2);

    WebElement root3 = shadowRoot2.findElement(By.cssSelector("settings-basic-page"));
    WebElement shadowRoot3 = expandRootElement(root3);

    WebElement root4 = shadowRoot3
        .findElement(By.cssSelector("#advancedPage > settings-section > settings-privacy-page"));
    WebElement shadowRoot4 = expandRootElement(root4);

    WebElement root5 = shadowRoot4.findElement(By.cssSelector("settings-clear-browsing-data-dialog"));
    WebElement shadowRoot5 = expandRootElement(root5);

    WebElement root6 = shadowRoot5
        .findElement(By.cssSelector("cr-dialog div[slot ='button-container'] #clearBrowsingDataConfirm"));

    root6.click();
    wait.until(ExpectedConditions.invisibilityOf(root6));
}

ポップアップでデフォルトで選択されているオプションを変更するつもりがない場合でも、適切に機能するはずです(その場合、これらのチェックボックスの選択に関するいくつかのコードを追加する必要があります)。これで問題が解決するかどうか教えてください。これがお役に立てば幸いです。ここにも画面のスナップショットを追加しました- image

ロケーター戦略 からdocument.querySelector()google-chrome-devtools

ただし、目的の要素が shadow-dom から開かれるため、elementToBeClickable()に対してWebDriverWaitを誘導する必要があります。そしてあなたはあなたに次の解決策をすることができます:

  • コードブロック:

    driver.get("chrome://settings/clearBrowserData");
    new WebDriverWait(driver, 5).until(ExpectedConditions.elementToBeClickable((WebElement) ((JavascriptExecutor)driver).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')"))).click();
    System.out.println("Clear data Button Clicked");
    
  • コンソール出力:

    Clear data Button Clicked
    
0
DebanjanB