Instagram上的硒元素选择

时间:2018-06-26 19:23:52

标签: python-3.x selenium selenium-webdriver automation selenium-chromedriver

我正试图通过从网页中选择“心脏元素”并单击它来创建一个喜欢图像的Instagram机器人。

我看到元素是这样包裹的:

<div class="eo2As ">
<section class="ltpMr Slqrh">
<a class="fr66n tiVCN" href="#" role="button">
<span class="Szr5J coreSpriteHeartOpen ">Like</span></a>

整个页面中所有不同的heart元素的类值都相同。

我的代码:

from selenium import webdriver
username = "----"
password = "----" #values present in original file

getdriver = ("https://www.instagram.com/accounts/login/")

driver = webdriver.Chrome(r'C:\testDir\chromedriver_win32\chromedriver.exe')
driver.get(getdriver)

driver.find_element_by_xpath("//input[@name='username']").send_keys(username)
driver.find_element_by_xpath("//input[@name='password']").send_keys(password)
driver.find_element_by_xpath("//button[contains(.,'Log in')]").click()

#working perfectly till here

like = driver.find_element_by_css_selector('.Szr5J.coreSpriteHeartOpen')
#spits error in this line

for x in range(0,len(like)):
    if like[x].is_displayed():
        like[x].click()

它不断吐出错误:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".Szr5J.coreSpriteHeartOpen"}

我尝试使用不同的类名模式,但无法弄清楚该怎么做!

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

尝试以下选项:

# the script is too quick and tries to locate the element before the page is fully loaded. That's why it is useful to use `WebDriverWait`
like = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CSS_SELECTOR, '.Szr5J.coreSpriteHeartOpen')))

或:

import time

time.sleep(5) # pause 5 sec after login in istagram
like = driver.find_element_by_css_selector('.Szr5J.coreSpriteHeartOpen')

请注意,如果我正确理解您要在页面上找到所有“心脏”。因此,您应该像这样使用driver.find_elements_by_css_selector

# gives an array of elements found
like = driver.find_elements_by_css_selector('.Szr5J.coreSpriteHeartOpen')

然后您可以使用循环来迭代此元素。

完整的工作代码在这里:

username = "----"
password = "----" #values present in original file

getdriver = ("https://www.instagram.com/accounts/login/")

driver = webdriver.Chrome(r'C:\testDir\chromedriver_win32\chromedriver.exe')
driver.get(getdriver)

driver.find_element_by_xpath("//input[@name='username']").send_keys(username)
driver.find_element_by_xpath("//input[@name='password']").send_keys(password)
driver.find_element_by_xpath("//button[contains(.,'Log in')]").click()

# after login there is a popup which should be closed
popup = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//div/div/button[contains(., Close)]')))
driver.find_element_by_xpath("//div/div/button[contains(., Close)]").click()

WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, '.Szr5J.coreSpriteHeartOpen')))
# find all 'hearts' presented on the page
likes = driver.find_elements(By.CSS_SELECTOR, ".Szr5J.coreSpriteHeartOpen")
print(len(likes))
print("WORKS")

for x in range(0,len(likes)):
    if likes[x].is_displayed():
        likes[x].click()
        print(x)

输出:

3
WORKS
0
1
2
相关问题