1.当我们在检查网页弹窗关闭按钮时
有时会发现定位的元素会出现如下图这样的::before伪元素方式出现:
这时如果想通过XPath直接定位,是不行的。
XPath是一种用于描述DOM结构的查询语言,它可以通过路径表达式定位和选择实际的DOM元素。然而,伪元素是通过CSS选择器生成的虚拟元素,并不在DOM结构中存在。因此,XPath无法直接选择和定位伪元素。
此时我们要想定位和操作伪元素,可以考虑以下两种方法:
-
尝试操作生成伪元素样式的真实元素:有时伪元素的样式是应用在真实元素上的,你可以尝试操作这个真实元素来达到你的目的。
-
更改CSS选择器:如果伪元素的样式是通过CSS选择器应用在其他实际元素上的,你可以尝试修改CSS选择器来选中符合条件的实际元素。
根据不同情况,这里我选中的就是伪元素上方的实际元素,再使用CSS_SELECTOR进行定位:
wd.find_element(By.CSS_SELECTOR, "[class=\"jsx-2320072050 iconfont icon-close\"]")
这样我们的成功选中我们需要的元素了。
2.第二种情况是未加载完成元素如何在其加载完成后,选中该元素
如下图的弹窗广告:
其右边的X和关闭都是伪装的关闭按钮。只有等其加载完毕之后,左上角真正的关闭按钮才会 出现:
这时我们如果直接使用CSS_SELECTOR选择左上角关闭按钮的元素时,可能会直接抛出异常:
Unable to locate element: {"method":"css selector","selector":"[style="cursor: pointer; position: absolute; top: 0px; left: 0px; z-index: 2147483646; width: auto; height: auto;"]"}
(Session info: chrome=114.0.5735.199)
这是因为web.driver的遍历过程很快,如果找了一圈没有发现此元素的话会直接报错。所以我们可以通过selenium中的隐式等待方法(implicitly_wait
),如下图:
wd.implicitly_wait(10) # 设置隐式等待:如果找不到元素,每隔半秒钟去界面上查看一次,直到找到该元素进入下一步
implicitly_wait
方法是在创建webdriver.Chrome()
实例后立即调用的。它设置一个全局的等待时间,用于查找元素时的等待操作。在隐式等待期间,WebDriver将等待给定的时间(在这里是10秒),在每次查找元素时都会进行尝试。如果在等待时间内找到了元素,WebDriver将立即执行下一步操作。如果等待时间耗尽仍然找不到元素,才会抛出NoSuchElementException
异常。大大提高了代码的容错性。
伪元素关闭按钮的点击和延时广告关闭的完整代码如下:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
class Ad_close():
def __init__(self, url):
self.url = url
self.wd=None
def open_wd(self):
self.wd = webdriver.Chrome()
self.wd.get(self.url)
def find_ad(self):
self.open_wd()
self.wd.implicitly_wait(10) # 设置隐式等待:如果找不到元素,每隔半秒钟去界面上查看一次,直到找到该元素进入下一步
close = self.wd.find_element(By.CSS_SELECTOR, "[class=\"jsx-2320072050 iconfont icon-close\"]")
close.click()
close_ad=self.wd.find_element(By.CSS_SELECTOR,"[style=\"cursor: pointer; position: absolute; top: 0px; left: 0px; z-index: 2147483646; width: auto; height: auto;\"]")
close_ad.click()
print("successful")
time.sleep(5)
self.wd.quit()
url = "https://cupfox.app/"
close = Ad_close(url) # 类的实例化
close.find_ad()
综上所述,就可以完成CSS_SELECTOR定位网页元素中的伪元素,以及使用隐式等待寻找广告的关闭按钮元素