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

时间:2016-04-06 11:26:23

标签: 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

我做错了什么?

2 个答案:

答案 0 :(得分:1)

这可以得到你想要的东西:

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"等..

答案 1 :(得分:0)

您发布的网址不包含//*[@id="react-root"]/section/nav/div/div/div/div[1]/div[2]/div[2]/div/a[1]。但是我假设当将(虚拟)鼠标光标从你的search_field移动到你想要点击的元素时,它会在页面上产生一些MouseOver效果,从某种意义上说是一个覆盖物弹出或隐藏可点击的东西背后的元素。

我遇到了同样的问题,并解决了这个问题: How to avoid MouseOver on Selenium Click()