【问题标题】:Python (Selenium) - Invalid selector when using XpathPython (Selenium) - 使用 Xpath 时选择器无效
【发布时间】:2020-05-22 21:20:35
【问题描述】:

我想让我的 python 点击​​网页中的链接,我尝试了以下 3 种方法来在我的 python 代码中指定 Span 元素的 Xpath:

driver.find_element_by_xpath("//*[@id='ChartUnitsHistory_ranges']/span[text()='1y']").click()
driver.find_element_by_xpath("//div[@class='graphControls']/span/1y")
driver.find_element_by_xpath("//a[@class='graphControls']/span[text()='1y']").click()

但所有这些都失败并显示相同的错误消息:

selenium.common.exceptions.InvalidSelectorException:消息: 指定的选择器无效。

更新错误信息:

Traceback (most recent call last):   File "02042020.py", line 31, in <module>
    driver.find_element_by_xpath("//span[@id='ChartUnitsHistory_ranges']/a[text()='1y']").click() File "C:\Users\username\PycharmProjects\Web_Scraping\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 394, in find_element_by_xpath
    return self.find_element(by=By.XPATH, value=xpath)   File "C:\Users\username\PycharmProjects\Web_Scraping\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 976, in find_element
    return self.execute(Command.FIND_ELEMENT, {   File "C:\Users\username\PycharmProjects\Web_Scraping\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)   File "C:\Users\username\PycharmProjects\Web_Scraping\venv\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace) selenium.common.exceptions.InvalidSelectorException: Message: The specified selector is invalid.

我需要帮助才能为“1y”选项提出正确的 Xpath。

HTML 源代码:

<div class="graphControls">
            <a href="javascript:jsChartUnitsHistory.getOptions().shiftRange(100, true)">&lt;&lt;</a>&nbsp;
            <a href="javascript:jsChartUnitsHistory.getOptions().shiftRange(33, true)">&lt;</a>
            &nbsp;&nbsp;
            <a href="javascript:jsChartUnitsHistory.getOptions().shiftRange(33, false)">&gt;</a>&nbsp;
            <a href="javascript:jsChartUnitsHistory.getOptions().shiftRange(100, false)">&gt;&gt;</a>&nbsp;
            <a href="javascript:jsChartUnitsHistory.getOptions().updateRange(0,'now')">&gt;|</a>
            &nbsp;&nbsp;&nbsp;&nbsp;
            <a href="javascript:jsChartUnitsHistory.getOptions().zoom(50);">[ + ]</a>
            <a href="javascript:jsChartUnitsHistory.getOptions().zoom(200);">[ - ]</a>
            &nbsp;&nbsp;
        <span id="ChartUnitsHistory_ranges" style="">
                    <a href="javascript:jsChartUnitsHistory.getOptions().updateRange(1,'year')">1y</a>
            <a href="javascript:jsChartUnitsHistory.getOptions().updateRange(3,'month')">3m</a>
            <a href="javascript:jsChartUnitsHistory.getOptions().updateRange(1,'month')">1m</a>
            <a href="javascript:jsChartUnitsHistory.getOptions().updateRange(2,'week')">2w</a>
            <a href="javascript:jsChartUnitsHistory.getOptions().updateRange(1,'week')">1w</a>
            <a href="javascript:jsChartUnitsHistory.getOptions().updateRange(3,'day')">3d</a>
            &nbsp;&nbsp;&nbsp;
        </span>
            <a href="#" id="ChartUnitsHistory_embiggen" onclick="EnlargeFlotChart( 'ChartUnitsHistory', jsChartUnitsHistory, 1100, 312 ); return false">enhance</a>
            <a href="#" id="ChartUnitsHistory_restore" style="display:none;" onclick="RestoreFlotChart( 'ChartUnitsHistory', jsChartUnitsHistory, 700, 160 );;return false">unenhance</a>
            <div style="clear: both;"></div>
</div>

这些元素的布局在网页上是这样的:

>> >| [ + ] [ - ] 1年 3m 1m 2w 1w 3d 提高 未增强

另请参阅所附网页截图: Screenshot of the webpage

请让我知道提供的信息是否足够。先感谢您!

【问题讨论】:

    标签: python html selenium xpath


    【解决方案1】:

    文本“1y”在&lt;a&gt;标签中,带有id='ChartUnitsHistory_ranges'的父元素是&lt;span&gt;

    driver.find_element_by_xpath("//span[@id='ChartUnitsHistory_ranges']/a[text()='1y']").click()
    

    "//div[@class='graphControls']/span/1y" 不起作用,因为“1y”在这里被视为标签。

    "//a[@class='graphControls']/span[text()='1y']" 不起作用,因为 class='graphControls' 位于 &lt;div&gt; 标记中,并且该元素不是直接子元素,/ 用于直接子元素,// 用于任何后代。

    您也可以为此使用css_selector

    driver.find_element_by_css_selector('#ChartUnitsHistory_ranges > [href$="(1,\'year\')"]').click()
    

    【讨论】:

    • 我使用了您提供的 xpath,但仍然出现同样的错误。我还在 xpath 代码行之前添加了 driver.implicitly_wait(5) 。有什么建议?谢谢:)
    • @an1que 你收到的是Invalid selector exception?这是有线的。实际上,您使用的所有xpath 都是有效的,只是不匹配。你能发布完整的错误信息吗?
    • driver.find_element_by_xpath("//span[@id='ChartUnitsHistory_ranges']/a[text()='1y']").click() 文件“”,第 394 行,在 find_element_by_xpath return self.find_element(by=By.XPATH, value=xpath) File ", line 976, in find_element return self.execute(Command.FIND_ELEMENT, { File "", line 321, in execute self.error_handler.check_response(response)文件“”,第 242 行,在 check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.InvalidSelectorException: Message: The specified selector is invalid.
    • 请查看原始帖子中更新的错误消息以便更好地查看。
    • @an1que 可以分享链接吗?
    【解决方案2】:

    所需元素是启用了JavaScript 的元素,因此要理想地单击该元素,您必须为element_to_be_clickable() 诱导WebDriverWait,您可以使用以下Locator Strategies 之一:

    • 使用LINK_TEXT

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.LINK_TEXT, "1y"))).click()
      
    • 使用CSS_SELECTOR

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.graphControls span#ChartUnitsHistory_ranges a[href*='year']"))).click()
      
    • 使用XPATH

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='graphControls']//span[@id='ChartUnitsHistory_ranges']//a[contains(@href, 'year')]"))).click()
      
    • 注意:您必须添加以下导入:

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

    【讨论】:

      【解决方案3】:

      如果您使用的是 Chrome,您可以点击 F12 切换到开发者模式并找到 HTML 元素。然后右键单击要复制的元素:

      • CSS 选择器
      • Xpath 或完整 Xpath
      • JS 路径
      • 样式

      在您的情况下,您需要复制Xpath。 这将是获取 Xpath 的快速方法。

      【讨论】:

      • "然后右键单击要复制的元素:" 可以写成“你可以按照这些提示导航到Xpath”。
      猜你喜欢
      • 2014-09-01
      • 2019-08-30
      • 2021-04-14
      • 2012-02-13
      • 2012-03-25
      • 1970-01-01
      • 1970-01-01
      • 2020-08-08
      • 1970-01-01
      相关资源
      最近更新 更多