簡體   English   中英

為什么我不能使用 (C#) Selenium By.CssSelector() 訪問一些 Salesforce DOM 元素,而我可以在它們的“遠距離”祖先節點下“看到”它們

[英]Why can't I access some Salesforce DOM elements with (C#) Selenium By.CssSelector(), when I can 'see' them under their 'distant' ancestor nodes

我正在嘗試通過具有 Lightning 組件 (LWC) 的 Salesforce 實現編寫 E2E UI 測試。 我正在使用 Selenium 和 C# 來自動化測試。 我已經成功地使用 XPaths 定位了我的目標元素,但是已經閱讀了推薦使用 CSS 選擇器(為了自動測試速度和穩健性),所以我試圖將我的By調用從By.XPath()轉換為By.CssSelector()

但是,在將 CSS 選擇器與 Salesforce 一起使用時,我看到了奇怪的行為,並且我發現無法訪問 DOM 中的某些元素,即使當我訪問它們的(遙遠的)祖先時我可以“看到”它們。

這段代碼...

var cssSel = "body";
var element = wait.Until(ExpectedConditions.ElementExists(By.CssSelector(cssSel)));
Console.WriteLine(element.GetAttribute("outerHTML"));

給我 DOM 中<body>節點下的每個元素。 很好,我可以看到整個 DOM 結構——包括我想要定位的元素。

然后我可以將搜索細化為...

var cssSel = "body>div.desktop div.slds-no-print";

我得到類似...

<div class="slds-no-print oneAppNavContainer" data-aura-rendered-by="299:0;p" data-aura-class="oneAppNavContainer" style="top: 83px;">
    <one-appnav data-data-rendering-service-uid="138" data-aura-rendered-by="244:0">
        <div class="slds-context-bar">
            <div class="slds-context-bar__primary navLeft">
                <div class="slds-context-bar__item slds-context-bar_dropdown-trigger slds-dropdown-trigger slds-dropdown-trigger--click slds-no-hover">
                    <div class="appLauncher slds-context-bar__icon-action" role="navigation" aria-label="App">
                        <one-app-launcher-header class="slds-icon-waffle_container">
                            <button class="slds-button slds-show" aria-haspopup="dialog">
                                <div class="slds-icon-waffle">
                                    <div class="slds-r1"/>
                                    .
                                    .
                                    <div class="slds-r9"/>
                                    <span class="slds-assistive-text">App Launcher</span>
                                </div>
                            </button>
                        </one-app-launcher-header>
                    </div>
                    <span class="appName slds-context-bar__label-action slds-context-bar__app-name">
                        <span class="slds-truncate" title="Critical Indicators – Sales">Critical Indicators – Sales</span>
                    </span>
                </div>
            </div>
            <one-app-nav-bar class="slds-grid slds-has-flexi-truncate" one-appnavbar_appnavbar-host="">
                <span one-appnavbar_appnavbar="" class="slds-assistive-text" id="operationId-5">Press Spacebar to reorder.</span>
                <span one-appnavbar_appnavbar="" class="slds-assistive-text keyboardDnd" id="dndAssistiveText-5" aria-live="assertive"/>
                <nav one-appnavbar_appnavbar="" class="slds-context-bar__secondary navCenter" role="navigation" aria-label="Global">
                    <div one-appnavbar_appnavbar="" class="slds-grid slds-has-flexi-truncate navUL" role="list" aria-describedby="operationId-5">
                        <one-app-nav-bar-item-root one-appnavbar_appnavbar="" class="navItem slds-context-bar__item slds-shrink-none slds-is-active" data-id="home" data-assistive-id="operationId" aria-hidden="false" draggable="true" role="listitem">
                            <a class="slds-context-bar__label-action dndItem" href="/lightning/page/home" title="Home" tabindex="0" draggable="false" aria-current="page">
                                <span class="slds-truncate">Home</span>
                            </a>
                        </one-app-nav-bar-item-root>
   .
   .
 <!-- hundreds of lines of elements cut out -->
   .
   .
                    </div>
                </nav>
            </one-app-nav-bar>
        </div>
    </one-appnav>
    <!--render facet: 301:0;p-->
</div>

仍然很好 - 我的目標元素仍然在那個 DOM 結構中。 但是,如果我現在用這些中的任何一個來獲取下一個元素...

var cssSel = "body>div.desktop div.slds-no-print>one-appnav";
// or
var cssSel = "body>div.desktop div.slds-no-print one-appnav";
// or
var cssSel = "one-appnav";

我只取回那個單一元素,並且它不包含任何子元素......

<one-appnav data-data-rendering-service-uid="138" data-aura-rendered-by="244:0"></one-appnav>

我的目標元素在這個<one-appnav>元素之下。 但是,如果我嘗試使用類似...的方式訪問它們

var cssSel = "body>div.desktop div.slds-no-print>one-appnav>div.slds-context-bar";
// or
var cssSel = "body>div.desktop div.slds-no-print>one-appnav div.slds-context-bar";
// or
var cssSel = "body>div.desktop div.slds-no-print div.slds-context-bar";

我得到一個例外...

OpenQA.Selenium.NoSuchElementException: no such element: Unable to locate element:
 {"method":"css selector",
  "selector":"body>div.desktop div.slds-no-print>one-appnav>div.slds-context-bar"}

盡管我之前可以在 DOM 樹中看到該元素(如上面的示例輸出所示)。

當我檢查 Salesforce 頁面時,我還可以在 Chrome Inspector 中看到所有目標元素。

那么,為什么在訪問他們的“遠距離”祖先時我可以在 DOM 樹中看到我的目標元素,但在訪問他們更“最近”的祖先時卻看不到? 同樣,我使用 XPath 訪問所有這些目標元素沒有問題。 那么為什么不使用 CSS 選擇器呢?

因此,試圖為這種奇怪的情況找到解決方案並不快樂。 事實上,我現在在不同的 Salesforce DOM 樹中遇到了類似的情況。

再次,我可以看到更高的“遠”祖先下方的整個 DOM 樹,但是當我將目標定位在樹的更下方時,在某個點上只有單個元素可用,而在它下面顯然沒有任何可訪問的元素。

同樣,這似乎只是在訪問By.CssSelector時出現的問題。 當我使用By.XPath時,一切都按預期工作——我可以訪問 DOM 樹中的任何元素。

這里有一個有趣的點——當我比較兩個 DOM 樹中的兩個“麻煩”元素時——原始場景中的一個,以及我剛剛發現的最新一個......

原來的...

<one-appnav data-data-rendering-service-uid="138" data-aura-rendered-by="244:0"></one-appnav>

最新的...

<force-aloha-page data-data-rendering-service-uid="1102" data-aura-rendered-by="6404:0" force-alohapage_alohapage-host=""/>

這些元素的共同因素是...

  • Salesforce 使用的非標准 html 標簽名稱
  • 它們內部使用的相同屬性: data-data-rendering-service-uiddata-aura-rendered-by

我的感覺是這與rendering / rendered屬性有關。 我不確定他們做了什么,或者他們相關的動態值指向什么......可能指向一個javascript函數? 此處提出的問題,Salesforce 沒有任何回應。

看起來我只需要恢復使用By.XPath代替。 希望這會幫助找到類似情況的人。 如果您找到解決方案,請告訴我。

編輯:

從那以后,我發現了對 Salesforce 更高版本(2020 年春季)的引用,他們建議在 CSS 選擇器上使用 XPaths ,其中特別指出......

*Convert non-XPath locators to XPath*
 
LWC uses a _polyfill_ to implement shadow DOM rather than a native browser
implementation. This implementation restricts Selenium access by non-XPath
selectors, like By.cssSelector(), but still allows direct access with By.xpath().
The simplest fix is to convert your non-XPath locators to XPath.
作為參考,我正在使用:
- Microsoft.NETCore.App (v3.1.0)
- C# (v8)
- Selenium.Support package (v4.1.0)
- Chrome and Chromedriver (v102.0.5005.61)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM