2016-04-06 11 views
3

Ich versuche Button Text in instagram Post-Seite (Seite Beispiel - https://www.instagram.com/p/BD2C8pQwO8X/) zu erhalten folgenSelen Python - Element ist nicht anklickbar am Punkt

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() 

bekam aber einen Fehler:

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 

was mache ich falsch?

+0

wie ein anderes Element scheint das Element, das Sie klicken möchten, überlappen. an welcher Zeile bekommst du den Fehler? – fabersky

+0

Datei "/Users/kr/PycharmProjects/education_py/instagram.py", Zeile 24, in follow_from_tag post.click() –

+0

werfen Sie einen Blick auf diese: http://stackoverflow.com/a/19763087/1033737 – fabersky

Antwort

0

Die von Ihnen gepostete URL enthält keine //*[@id="react-root"]/section/nav/div/div/div/div[1]/div[2]/div[2]/div/a[1]. Aber ich gehe davon aus, dass wenn Sie den (virtuellen) Mauszeiger von Ihrem search_field zu dem Element, auf das Sie klicken möchten, etwas MouseOver-Effekt auf der Seite in dem Sinne verursachen, dass ein Overlay oder etwas auftaucht und das anklickbare Element hinter sich versteckt.

hatte ich das gleiche Problem und löste es wie folgt aus: How to avoid MouseOver on Selenium Click()

+1

Dieser Teil funktioniert. Es bringt Sie zu "https: // www.instagram.com/explore/tags/moscow /', es ist auf einer ganz anderen Seite der URL geschrieben –

+0

Ja, dieser Teil führt mich zu Top-populäre Beiträge mit dem Tag Moskau, aber nachdem ich jeden Beitrag geöffnet habe und Buttontext drucken möchte –

1

Diese bekommt, was Sie wollen:

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 

Die Ausgabe der Drucke:

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> 

Sie möchten vielleicht um Fehlerbehandlung hinzuzufügen und bessere XPaths zu verwenden, aber es bekommt, was Sie brauchen, kommentieren Sie einfach die btn.click(), wenn Sie folgen möchten.

Ich vermisste Sie den Text überprüfen, wenn Sie den Text überprüfen möchten, können wir enthält mit "Follow" wie das Wort verwenden zum Spiel:

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) 

Die Ausgabe jetzt, nachdem ich wählte eine nach dem Zufallsprinzip zu folgen :

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 

So brauchen Sie nur ein if btn.text.lower() == "follow" etc ..

Verwandte Themen