【问题标题】:Issue finding xpath that contains certain class (python, selenium, chromedriver)查找包含特定类(python、selenium、chromedriver)的 xpath 的问题
【发布时间】:2020-07-15 22:19:37
【问题描述】:

我试图找到下面用红色框起来的元素。由于这个特定元素的信息发生了变化,我使用上面突出显示的类 class= "_2z6nI" 来引用红色框内的元素,因为该类的位置及其与我尝试按下的元素的关系保持不变。

WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//body//div[contains(@class,'_2z6nI')]*how do I define additional divisions here?*)).click()

希望能解释一下如何确定需要在 [contains(@class,'_2z6nI')] 之后写入的附加路径,以到达红色框内的元素。作为参考,我尝试单击的元素是 Instagram 用户在用户主页上的第一个帖子。

更新:

一些可测试的代码:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
import time

class bot:

    def __init__(self):
        self.driver = webdriver.Chrome("path here")

    def zoom(self, new_zoom):
        """
        :param new_zoom: zoom level as a percentage
        """
        change_js = """
        var selectBox = document.querySelector("settings-ui").shadowRoot.querySelector("#main").shadowRoot.querySelector("settings-basic-page").shadowRoot.querySelector("settings-appearance-page").shadowRoot.querySelector("#zoomLevel");

        var changeEvent = new Event("change");

        selectBox.value = arguments[0];
        selectBox.dispatchEvent(changeEvent);
        """

        self.driver.get("chrome://settings/")
        new_zoom = round(new_zoom / 100, 2)
        self.driver.execute_script(change_js, new_zoom)

    def accessPlayerProfile(self):
        driver = self.driver
        driver.get("https://www.instagram.com/zuck/")
        time.sleep(2)
        #click on first post
        WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "(//div[contains(@class,'Nnq7C weEfm')])[1]"))).click()

if __name__ == "__main__":
    bot = bot()
    bot.zoom(80)
    bot.accessPlayerProfile()

【问题讨论】:

    标签: python selenium selenium-chromedriver


    【解决方案1】:

    在您的示例中,您在下划线字符之前错过了空格,并且您正在尝试导航子 div,因此您可以参考以下解决方案

    //body//div[contains(@class,' _2z6nI')]//article//div//div//div/div
    

    你也可以使用下面的 xpath : (updated)

      (//div[contains(@class,'Nnq7C weEfm')])[1]
    

    您的问题的有效解决方案

     element= WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//body//div[contains(@class,'_2z6nI')]//div//div//div[1]//div[1]//a[1]//div[1]//div[2]")))
            driver.execute_script("arguments[0].click()", element)
    

    输出:

    【讨论】:

    • 谢谢,但是 WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//body//div[contains(@class,'_2z6nI')]// article//div//div//div/div"))).click() 也不起作用。我不明白为什么,因为在检查了多个页面并且类与元素的关系之后,我要选择的结构是相同的:向下 1 篇文章和 4 部分到达元素。
    • 你试过剩下的两个吗?如果是这样,请确保您的 _2z6nI 和 ySB3v 类名不是动态的
    • 是的,我也尝试了第二个。 _2z6nl 是常数,所以不确定为什么 1 或 2 不起作用。但是 ySB3v 是动态的,所以第三个不起作用。
    • 我之前也尝试过,但它也不起作用,我复制了上面可测试的部分代码。我的代码涉及在 chrome 中缩小 80%,但即使在缩放之后,我想要单击的元素及其与类 _2zq7c 和 Nnq7c 的关系似乎保持不变。
    • xpath 不是问题,请参考更新部分的解决方案
    猜你喜欢
    • 2017-11-17
    • 2021-12-10
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 2020-11-29
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多