python find_element仅适用于XPATH

3bygqnnd  于 2023-03-16  发布在  Python
关注(0)|答案(1)|浏览(147)

我正在尝试用selenium和chrome驱动程序制作一个预订程序。Selenium只能通过XPATH找到元素,无法定位By.IDBy.CSS_SELECTORBy.CLASS_NAME元素。我尝试用不同的形式表达它。通过类定位在我程序中的其他文件中工作,这就是为什么我感到困惑。
下面是我的代码中(我认为)有问题的部分:

from selenium.webdriver.remote.webdriver import WebDriver
from selenium.webdriver.common.by import By
class BookingFiltration():
    def __init__(self, driver:WebDriver):
        self.driver = driver

    def apply_star_rating(self, star_value):
        star_filter_box=self.driver.find_element(By.ID,"filter_group_class_:R14q:")
        star_child_elements = star_filter_box.find_elements(By.CSS_SELECTOR, '*')

        for star_element in star_child_elements:
            if str(star_element.get_attribute('innerHTML')).strip() == f'{star_value} stars':
                star_element.click()

它不能通过ID定位元素。下面是我尝试定位的内容

它连接到调用函数的主文件和另一个函数定义文件。
下面是后者的相关部分:

import booking.constants as const
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from booking.booking_filtrations import BookingFiltration
import time
#  <...>
    def apply_filtrations(self):
        filtration = BookingFiltration(driver=self)
        filtration.apply_star_rating(star_value=5)

为什么它不能通过XPATH以外的方法找到这个元素(或者任何一个)?如果提供的代码不够,我道歉。如果有必要,我会重新提问。

sqougxex

sqougxex1#

你用什么xpath来定位星星过滤器框?不管怎样,我怀疑这个问题是由于包含:字符的id造成的。我试过了,效果很好

driver.find_element(By.CSS_SELECTOR, 'div[id="filter_group_class_:R1cq:"]')

另外,由于两个:之间的部分可能会发生变化(在您的示例中是R14q,在我的示例中是R1cq),您可以考虑使用

driver.find_element(By.CSS_SELECTOR, 'div[id*=filter_group_class]')

其中*=表示“包含”。

相关问题