'visible=>true' 在我使用 Button 方法时没有定位可见按钮

'visible=>true' is not locating the visible button when I use Button method

我正在使用下面的代码,希望它能找到可见按钮

element = @browser.button(text: 'Search', visible: true)

而且它没有找到可见按钮。但是下面的代码定位了可见按钮

element = @browser.element(xpath: "//button[text()='Search']", visible: true)

这是预期的吗?或者这是一个问题?

HTML代码

<button type="button" title="" data-uid="DSDL_U1" data-action="search" data-viewitemid="DSDL_U1_-1_L21" triggeredactionhandler="search" buttonprocesstarget="CUSTOMER_IND_QUICK_SEARCH_BY_ID_NAME" class="icon icon-detail-search" id="DSDL_U1_-1_L21_L_1_C" tabindex="10047">Search</button>

@贾斯汀

回答你的问题

@browser.buttons(text: 'Search').count

return 6

@browser.buttons(text: 'Search', visible: true).count

return 2

现在我检查了

@browser.buttons(text: 'Search', visible: true)[0].present?

return是真的

但是如果我点击,那么它 returns

element click intercepted: Element <button tabindex="5" type="button" class="icon icon-detail-url" id="U1_-1_L5_L_1_C" style="outline: orangered solid 2px !important; background-color: rgb(255, 255, 255);">...</button> is not clickable at point (43, 258). Other element would receive the click: <div id="homePageSearch" class="searchGrpContainer homePageSearch populated" data-renderer="menu" data-headertype="button" data-style="tree" data-zone="overlay">...</div>
  (Session info: chrome=89.0.4389.90)

但是如果写

@browser.buttons(text: 'Search',visible: true)[1].present?

这 return 是正确的,但如果触发了点击,那么它就会点击。

你问我两个元素的html

@browser.buttons(text: 'Search',visible: true)[0].html

returns

<button tabindex="5" type="button" class="icon icon-detail-url" id="U1_-1_L5_L_1_C" style="outline: orangered solid 2px !important; background-color: rgb(255, 255, 255);"><span>Search</span></button>

第二个元素

@browser.buttons(text: 'Search',visible: true)[1].html

returns

<button type="button" title="" data-uid="DSDL_U1" data-action="search" data-viewitemid="DSDL_U1_-1_L21" triggeredactionhandler="search" buttonprocesstarget="CUSTOMER_IND_QSEARCH_PARTYID_ALTCUSTID" class="icon icon-detail-search" id="DSDL_U1_-1_L21_L_5_C" tabindex="10047">Search</button>

当我点击第一个搜索按钮时,它会在同一个 html 中打开另一个 window,在那个新的 window 中有另一个搜索按钮,所以它与第一个搜索匹配按钮(我点击打开)和第二个搜索按钮在我即将点击的新 window 中。但是程序检测到两个搜索按钮可见。

你最终有 2 个问题:

  • XPath 如何处理文本
  • Selenium 如何确定什么是 visible/displayed

XPath 如何处理文本

有效定位文本的差异归结为点与文本 () 的 XPath 差异。您可以在其他问题中看到解释 - 例如 。只需:

  • 点:匹配所有直接和后代文本节点的串联
  • text(): 只匹配元素的单个直接文本节点

对于 Watir 定位器:

@browser.button(text: 'Search', visible: true)                      # this uses dot
@browser.element(xpath: "//button[text()='Search']", visible: true) # this uses text()

对于<button><span>Search</span></button>,它具有“Search”的串联文本,但只有“”和“”的直接文本节点。这就是为什么 Watir 使用 :text 定位器定位它,而不是在使用 text().

:xpath 定位器时定位它的原因

相比之下,<button>Search</search>有“Search”的连接文本和“Search”的直接文本节点。因此,它将与两个 Watir 定位器匹配。

Selenium 如何确定什么是 visible/displayed

Selenium 认为被另一个元素覆盖的元素被显示,这意味着 Watir 认为它存在。例如,对话框覆盖下的元素仍将被视为对用户可见。您的两个按钮都被认为是可见的。

没有可以区分被其他元素覆盖(遮挡)的元素的 Watir 定位器。但是,您可以手动执行此操作:

@browser.buttons(text: 'Search', visible: true).find { |btn| !btn.obscured? }

解决方案

鉴于 2 个按钮的 HTML,我认为最好的方法是使用不同的属性实际定位按钮。 “triggeredactionhandler”似乎是独一无二的:

@browser.button(triggeredactionhandler: 'search')