【发布时间】:2019-02-18 23:19:35
【问题描述】:
我正在尝试找到一个可点击的(我认为 - 请参阅下面的代码)h2 元素。
这是 html 的 sn-p:
<div class="center-block flex-y v-center h-fill">
<div class="flex-y v-center h-start">
<h2 class="section-name ng-binding" ng-attr-tabindex="{{ appbar.service.disableProductSectionClick ? -1 : 0 }}" ng-click="appbar.clickProductSection()" ng-keydown="appbar.clickProductSection($event)" ng-class="{ 'inactive': appbar.service.disableProductSectionClick || !appbar.homeState }" tabindex="0">Password Safe</h2>
<app-bar-breadcrumbs class="ng-isolate-scope">
<ul class="flex-x h-start v-center">
<!-- ngRepeat: link in crumbs.service.list track by $index -->.
<li ng-repeat="link in crumbs.service.list track by $index" ng-click="crumbs.navTo($index)" ng-keydown="crumbs.navTo($index, $event)" data-name="Requests" data-collapse="false" ng-attr-tabindex="{{ (crumbs.service.list.length === $index + 1 || link.method == 'stateless') ? '-1' : '0' }}" ng-hide="crumbs.service.hidden.indexOf($index) > -1" ng-class="{ 'stateless': link.method == 'stateless' }" class="flex-x static h-start v-center ng-binding ng-scope" tabindex="-1">
</li>
<!-- end ngRepeat: link in crumbs.service.list track by $index -->
</ul>
</app-bar-breadcrumbs>
</div>
</div>
我尝试使用 xpath 查找 h2 元素,有时使用文本。代码总是返回 TimeOutException。该元素不在框架内,但在 bt-app-bar 内。
- 完整的 xpath
homepage_link = wait.until(EC.element_to_be_clickable((By.XPATH, '/html/body/bt-app-chrome/bt-app-bar/div[2]/div[3]/div/h2')))
- xpath 带尾并包含
homepage_link = wait.until(EC.element_to_be_clickable((By.XPATH, '//h2[contains(., "Password Safe")]')))
- 带有文本的 xpath
homepage_link = wait.until(EC.element_to_be_clickable((By.XPATH, '//*[text()="Password Safe"')))
- 另一个带有文本的 xpath
homepage_link = wait.until(EC.element_to_be_clickable((By.XPATH,
'/div/h2[contains(text(),"Password Safe")]')))
- 完整的 css - 在这里复制有点冗长
我也看过这里的帖子:Locate an element in selenium using text inside h2 tag 没有什么对我有用。我只需要找到它并点击它。
这里有一些更简单但可能更容易诊断的东西。 我点击了一个我附上了上面截图的页面。如您所见,它的顶部有一个应用栏。右上角是一个菜单,在可点击元素的文本中包含“请求”。当我的应用程序点击它时,应用程序栏现在显示“帐户”,它之前显示“请求”。我无法检测到应用栏中的任何其他更改。单击“请求”后,我有一个 time.sleep(5) 和一个等待页面加载。当我通过单击查看 html 源代码更改时,似乎发生的一切(在应用程序栏的上下文中)是文本“请求”现在被指示更改为“帐户”。请参阅下面的 html 源代码。
我可以完美地找到“请求”元素:
requests_link = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'app-bar-quicklinks > ul > li:nth-child(1)')))
当应用栏更改为“帐户”时,该元素的 CSS 似乎与我在上面用于“请求”的 CSS 相同。然而,它超时了。怎么会?
<app-bar-quicklinks class="ng-isolate-scope" style="opacity: 1;">
<ul class="flex-x h-start v-center">
<!-- ngRepeat: link in qlinks.service.list track by $index -->
<li ng-repeat="link in qlinks.service.list track by $index" ng-click="qlinks.navTo($index)" ng-keydown="qlinks.navTo($index, $event)" tabindex="0" class="flex-x h-end v-center ng-binding ng-scope">Requests
</li>
<!-- end ngRepeat: link in qlinks.service.list track by $index --> .
<li ng-repeat="link in qlinks.service.list track by $index" ng-click="qlinks.navTo($index)" ng-keydown="qlinks.navTo($index, $event)" tabindex="-1" class="flex-x h-end v-center ng-binding ng-scope">Admin Sessions
</li>
<!-- end ngRepeat: link in qlinks.service.list track by $index -->
</ul>
</app-bar-quicklinks>
【问题讨论】:
-
如果您发布的 HTML 是正确的,那么 #2 应该可以工作。你确定它不在
IFRAME中吗?您是否尝试过等待可见且不可点击?也许那里发生了一些奇怪的事情。 -
@JeffC:它绝对不在 iframe 中。但它可能是隐藏的。我尝试等待可见结果相同。
-
我不认为您可以发布该页面的链接?
-
恐怕不行。我可以分享 html/网页的屏幕截图,以便您查看部分。粘贴所有内容将是矫枉过正。
-
你确定等待时间够吗?您是否尝试过添加断点并让页面完全加载然后继续执行脚本?页面完全加载所需的时间可能比预期的要长。