javascript - 使用 Selenium 和 Python 单击 JavaScript 类型按钮“喜欢”
问题描述
我正在尝试单击“赞”按钮。我试过“find_element_by_xpath()”,但对我没有用。有点迷茫怎么办
这是检查完整类代码:
<div class="grid">
<div class="user_hover_panel" style="width:100%;">
<ul class="list--horizontal float--left post-icons-list ng-isolate-scope" wt-on-outside-click="$ctrl.emojiOutSideClick($ctrl.postData.id)" wt-on-outside-click-enabled="$ctrl.toggleEmoji">
<li ng-class="{'selected': $ctrl.postData.is_liked, 'liked-desk' : true ,
'like-border-right' : ($ctrl.postData.privacyType == 'Personal' || $ctrl.postData.privacyType == 'Pro' || $ctrl.postData.privacyType == 'All' || $ctrl.postData.privacyType == 'Public'),
'like-border-none' : ($ctrl.postData.privacyType == 'Groups' || $ctrl.postData.privacyType == 'Staff' || $ctrl.postData.privacyType == 'Private')}" class="liked-desk like-border-right">
<a ng-mouseover="$ctrl.userContext.id != undefined && !$ctrl.isMobile && $ctrl.showLikeEmoji($ctrl.postData.id)" ng-mouseleave="$ctrl.hideLikeEmoji()" ng-click="!$ctrl.isMobile ? $ctrl.likeMedia($ctrl.postData.id, $root.context.id, $ctrl.postData.mediaTypeTagging, $ctrl.postData, true):$ctrl.toggleReaction($ctrl.postData.id)" class="cursor--pointer " data-own-entry="false">
<!-- ngIf: !$ctrl.postData.is_liked -->
<i ng-if="!$ctrl.postData.is_liked" class="icon icon-post-like private-link ng-scope">Like</i>
<!-- end ngIf: !$ctrl.postData.is_liked -->
<!-- ngIf: $ctrl.postData.is_liked -->
</a>
</li>
<li class="comment-desk" ng-click="$ctrl.togglePostCommentBox()">
<a href="javascript:" data-own-entry="false">
<i class="icon icon-post-cmt private-link">Comment</i>
</a>
</li>
<!-- ngIf: !$ctrl.isModalView && !$ctrl.isPostAsComment --><li ng-if="!$ctrl.isModalView && !$ctrl.isPostAsComment" ng-class="{
'shared-desk' : true}" ng-hide="$ctrl.postData.privacyType != 'Public'" class="ng-scope shared-desk">
<!-- ngIf: $ctrl.postData.mediaTypeTagging != 'photos' && $ctrl.checkBannerOrProfile(false) --><a data-ng-if="$ctrl.postData.mediaTypeTagging != 'photos' && $ctrl.checkBannerOrProfile(false)" href="javascript:" ng-click="$ctrl.shareMedia('news', $ctrl.postData.post_share_id ? $ctrl.postData.post_share_id : $ctrl.postData.post_id, $ctrl.postData.privacyType)" class="" data-own-entry="false">
<i class="icon icon-post-share private-link">Share</i>
</a><!-- end ngIf: $ctrl.postData.mediaTypeTagging != 'photos' && $ctrl.checkBannerOrProfile(false) -->
<!-- ngIf: $ctrl.postData.mediaTypeTagging !='news' && $ctrl.postData.mediaTypeTagging == 'photos' && $ctrl.postData.id != undefined && $ctrl.checkBannerOrProfile(false) -->
</li><!-- end ngIf: !$ctrl.isModalView && !$ctrl.isPostAsComment -->
</ul>
<!-- ngIf: $ctrl.userContext.id != undefined && $ctrl.toggleEmoji && $ctrl.postEmojiId == $ctrl.postData.id -->
</div>
</div>
我想点击:
<!-- ngIf: !$ctrl.postData.is_liked -->
<i ng-if="!$ctrl.postData.is_liked" class="icon icon-post-like private-link ng-scope">Like</i><!-- end ngIf: !$ctrl.postData.is_liked -->
<!-- ngIf: $ctrl.postData.is_liked -->
另外我不确定我是否点击了正确的元素!我只想点击喜欢按钮。我是 python 和 selenium 的新手,不知道该怎么做。
这是我正在做的代码!
from selenium import webdriver
import pyautogui as py
import time
PATH = "C:\Program Files (x86)\chromedriver_win32\chromedriver.exe"
driver = webdriver.Chrome(PATH)
driver.get("https://www.webtalk.co/")
time.sleep(3)
driver.maximize_window()
like_button = driver.find_element_by_xpath("//*[@id="30247788"]/div[5]/div/div/ul/li[1]/a/i")
like_button.click()
我收到了这个错误!
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id='30247788']/div[5]/div/div/ul/li[1]/a/i"}
(Session info: chrome=90.0.4430.212)
解决方案
元素最可持续的 XPath 是这样的:
//i[contains(text(),'Like')]
此 XPath 选择i
包含单词 的所有标记Like
。如果您不确定此 XPath 是否只返回一个元素,您也可以使其复杂一点(例如添加类选择器)
提示:尝试首先使用浏览器选择网站上的元素,而不是直接通过 selenium。看到这个
推荐阅读
- flutter - 动态切换脚手架主体
- java - 如何将重复值列表转换为关于 T 类字段的不同值列表
- html - 如何用css改变单词的形状?
- c# - 在 Typescript 中创建类数组
- ios - 从照片库中选择视频时,文件大小仅适用于 iOS 13.2 上 Ionic 中的视频
- python - 在 Python 中将多个重复值输入到列表中的方法
- python - 使用 scapy 修改接收到的数据包 src/dst
- angular - 将值传递给方法,而不声明额外的变量
- linux - 从 linux 中的另一个文件中删除包含多个字符串模式的文本文件中的行
- ios - 如何确保在文本字段中仅选择选择器数据