硒为何无法从我的xpath中找到这个看似简单的元素?

时间:2019-08-26 03:34:30

标签: python html selenium xpath

我对Selenium还是很陌生,但是这个错误只会让我震惊。 我正在尝试编写一个机器人,以在我的Instagram feed中的前10张照片上单击“赞”按钮。我只是从Chrome复制并粘贴了“赞”按钮的XPath,但是由于某种原因,该XPath无法使用。

代码如下:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from time import sleep, strftime
from random import randint


sleep(3)    
for x in range(1,10):
    button_like = webdriver.find_element_by_xpath('//*[@id="react-root"]/section/main/section/div[2]/div[1]/div/article[{}]/div[2]/section[1]/span[1]/button/span'.format(x))
    button_like.click()
    sleep(randint(2,3))

这是该部分的HTML,其中包含我要点击的按钮。

<section class="ltpMr Slqrh">
    <span class="FY9nT fr66n">
        <button class="dCJp8 afkep _0mzm-">
            <span class="glyphsSpriteHeart__filled__24__red_5 u-__7" aria-label="Unlike"></span>
        </button>
    </span>
    <span class="_15y0l">
        <button class="dCJp8 afkep _0mzm-">
            <span class="glyphsSpriteComment__outline__24__grey_9 u-__7" aria-label="Comment"></span>
        </button></span>
    <span class="_5e4p">
        <button class="dCJp8 afkep _0mzm-">
            <span class="glyphsSpriteShare__outline__24__grey_9 u-__7" aria-label="Share Post"></span>
        </button>
    </span>
    <span class="wmtNn">
        <button class="dCJp8 afkep _0mzm-">
            <span class="glyphsSpriteSave__outline__24__grey_9 u-__7" aria-label="Save"></span>
        </button>
    </span>
</section>

这是我收到的错误消息:

  

回溯(最近通话最近):     在第33行中输入文件“ / Users / JoshSong / Desktop /喜欢朋友的Photos.py”       button_like = webdriver.find_element_by_xpath('// [@ id =“ react-root”] / section / main / section / div [2] / div [1] / div / article [{}] / div [2 ] / section [1] / span [1] /button/span'.format(x))     在find_element_by_xpath中的第394行中,文件“ /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py”       返回self.find_element(by = By.XPATH,value = xpath)     文件“ /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py”,行978,在find_element中       'value':value})['value']     在执行的文件“ /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py”中,第321行       self.error_handler.check_response(响应)     文件“ /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/selenium/webdriver/remote/errorhandler.py”,第242行,在check_response中       引发exception_class(消息,屏幕,堆栈跟踪)   selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:无法找到元素:{“ method”:“ xpath”,“ selector”:“ // [@ id =” react-root“] / section / main / section / div [2] / div [1] / div / article [1] / div [2] / section [1] / span [1] / button / span“}     (会话信息:chrome = 76.0.3809.100)

2 个答案:

答案 0 :(得分:0)

我们需要更多的HTML才能充分回答问题。例如,使用您提供的解决方案将是:

like_button = driver.find_element_by_xpath("//span[@class='FY9nT fr66n']/button")
like_button.click()

基于提供的HTML,这将单击第一个按钮(实际上是您提供的“与众不同”按钮,但我假设“喜欢”按钮在那里)。如果您想要的每个“喜欢”按钮周围的span元素具有相同的类,则只需进行少量修改即可:

like_buttons = driver.find_elements_by_xpath("//span[@class='FY9nT fr66n']/button")
#create maxIndex of the lesser of the length, or the max index you want to press
maxIndex = MIN(9, len(like_buttons))
for i in range (0, maxIndex):
    like_buttons[i].click()

此解决方案应该起作用,假设每个“赞”按钮周围的span元素相同,并且该类不会在页面上未包装“赞”按钮的其他span元素上重用。如果您更新HTML并违反了这些假设,我将很乐意查看新的解决方案

答案 1 :(得分:-1)

当尝试使用带索引的路径时,我遇到类似的问题。我建议使用:// span [@ aria-label ='Like']。我没有将硒与python一起使用,但我假设有一个使用索引作为参数的find方法。因此,您可以使用它来打第一个like元素,然后打第二个,依此类推(但是从instagram网站上看来,一次只能检测到7个)