python - Selenium python - 元素在点不可点击

标签 python selenium xpath web-scraping instagram

我正在尝试在 Instagram 帖子页面中获取关注按钮文本(页面示例 - https://www.instagram.com/p/BD2C8pQwO8X/)

driver = webdriver.Chrome()
driver.set_window_size(1024, 768)
driver.get('https://www.instagram.com/accounts/login/')
driver.implicitly_wait(10)
username_field = driver.find_element_by_name('username')
password_field = driver.find_element_by_name('password')
username_field.send_keys(user_login)
password_field.send_keys(user_pass)
password_field.send_keys(Keys.RETURN)
time.sleep(5)


def find_tag():
    search_field = driver.find_element_by_xpath('//nav/div/div/div/div/input')
    search_field.send_keys('#moscow')
    time.sleep(1)
    driver.find_element_by_xpath('//*[@id="react-root"]/section/nav/div/div/div/div[1]/div[2]/div[2]/div/a[1]').click()


def follow_from_tag():
    top_20_posts = driver.find_elements_by_xpath('//article/div/div/div/a')
    for post in top_20_posts:
        post.click()
        time.sleep(1.5)
        print(driver.find_element_by_xpath('/html/body/div[2]/div/div[2]/div/article/header/span/button').text)



find_tag()
time.sleep(2)
follow_from_tag()

但出现错误:

selenium.common.exceptions.WebDriverException: Message: unknown error: Element is not clickable at point (511, 415). Other element would receive the click: <a class="_c2kdw" href="javascript:;" role="button" data-reactid=".1.1.0.0.1.$https=2//scontent-arn2-1=1cdninstagram=1com/t51=12885-15/e15/12479233_260398184295103_1013244176_n=1jpg?ig_cache_key=0MTIyMjM0Nzg4MzM1MDYzNTQzOA%3D%3D=12.0.0.1"></a>
  (Session info: chrome=49.0.2623.110)
  (Driver info: chromedriver=2.9.248307,platform=Mac OS X 10.10.5 x86_64

我做错了什么?

最佳答案

这得到了你想要的:

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

def wait(dr, x):
    element = WebDriverWait(dr, 5).until(
        EC.presence_of_element_located((By.XPATH, x))
    )
    return element

driver = webdriver.Chrome()
driver.set_window_size(1024, 768)
driver.get('https://www.instagram.com/accounts/login/')
driver.implicitly_wait(10)
username_field = driver.find_element_by_name('username')
password_field = driver.find_element_by_name('password')
username_field.send_keys("user")
password_field.send_keys("pass")
password_field.send_keys(Keys.RETURN)    

def find_tag():
    search_field = driver.find_element_by_xpath('//nav/div/div/div/div/input')
    search_field.send_keys('moscow')
    wait(driver, '//*[@id="react-root"]/section/nav/div/div/div/div[1]/div[2]/div[2]/div/a[1]').click()

def follow_from_tag():
    top_20_posts = [a.get_attribute("href") for a in
                    driver.find_elements_by_xpath("//a[contains(@href,'?tagged=moscow')]")[:20]]
    for href in top_20_posts:
        driver.get(href)
        print(href)
        btn = wait(driver, "//button[text()='Follow']")
       # btn.click() # uncomment to follow

打印输出:

https://www.instagram.com/p/BD249tsxEbl/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79810>
https://www.instagram.com/p/BD2puxzELOu/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79790>
https://www.instagram.com/p/BD2jrmyP8ec/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79750>
https://www.instagram.com/p/BD2v9NyvzIs/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79810>
https://www.instagram.com/p/BD2qkcZm8cg/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79790>
https://www.instagram.com/p/BD2sEWzLlEF/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79750>
https://www.instagram.com/p/BD25VA2vI6t/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79810>
https://www.instagram.com/p/BD2fRXoB1t2/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79790>
https://www.instagram.com/p/BD2jYlfE0Yw/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79750>
https://www.instagram.com/p/BD2s0PtoRP1/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79810>
https://www.instagram.com/p/BD2mn_QBQPK/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79790>
https://www.instagram.com/p/BD2zTmqM-5h/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79750>
https://www.instagram.com/p/BD2q6Qfqc5q/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79810>
https://www.instagram.com/p/BD2iivvDbiO/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79790>
https://www.instagram.com/p/BD2-WU2msdO/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79750>
https://www.instagram.com/p/BD2Qa2Rn0GV/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79810>
https://www.instagram.com/p/BD2ffCZDR8L/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79790>
https://www.instagram.com/p/BD2kqDhwywb/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79750>
https://www.instagram.com/p/BD2r4M7lf-h/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79810>
https://www.instagram.com/p/BD2t3PTAlJC/?tagged=moscow
<selenium.webdriver.remote.webelement.WebElement object at 0x7fa717d79790>

您可能想要添加错误处理并使用更好的 xpath,但它可以满足您的需求,如果您想遵循,只需取消注释 btn.click()

我想念你想检查文本,如果你想检查文本,我们可以使用包含 "Follow" 的词来匹配:

def follow_from_tag():
    top_20_posts = [a.get_attribute("href") for a in
                    driver.find_elements_by_xpath("//a[contains(@href,'?tagged=moscow')]")[:20]]
    for href in top_20_posts:
        driver.get(href)
        print(href)
        btn = wait(driver, "//button[contains(text(),'Follow')]")
        print(btn.text)

我随机选择一个跟随后的输出:

https://www.instagram.com/p/BD23RGrkLEN/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD2jrmyP8ec/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD249tsxEbl/?tagged=moscow
FOLLOWING
https://www.instagram.com/p/BD2v9NyvzIs/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD2qkcZm8cg/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD2sEWzLlEF/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD25VA2vI6t/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD2fRXoB1t2/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD2s0PtoRP1/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD2jYlfE0Yw/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD2mn_QBQPK/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD2zTmqM-5h/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD2-WU2msdO/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD2q6Qfqc5q/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD2iivvDbiO/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD29pcrDs6o/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD2Qa2Rn0GV/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD2ffCZDR8L/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD2kqDhwywb/?tagged=moscow
FOLLOW
https://www.instagram.com/p/BD2r4M7lf-h/?tagged=moscow
FOLLOW

所以你只需要一个 if btn.text.lower() == "follow" 等等。

关于python - Selenium python - 元素在点不可点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36449732/

相关文章:

java - 使用使用相对路径存储在 jar 中的资源文件中的 ChromeDriver.exe

java - Chrome 驱动程序无法在 Win XP 上加载

c# - 使用 xpath 获取定义类型的节点父节点

python - 使用 Python 和 ElementTree 在 XML 中搜索变量属性

python - 快速将 Pandas 列乘以年度系数

python - 电子竞技比赛预测器(机器学习)

Python:返回字典的函数,其键是输入参数的名称

Python Splinter 单击按钮 CSS

xpath - 无法使用 Oxygen XQuery 实现选择 XML 属性; Oxygen XPath 发出结果

python - 带有需要 dask 计算关键字参数的函数的自定义 dask 图