【问题标题】:Error in Selenium/Python script while a cycle that contains 'webdriver wait until' on Instagram在 Instagram 上包含“webdriver wait until”的循环时 Selenium/Python 脚本出错
【发布时间】:2018-12-14 18:55:30
【问题描述】:

我正在编写一个在 instagram 照片上设置喜欢的脚本,但是在一些喜欢后(一次 14、一次 50、一次 64),shell 给了我这个错误:

in <module> ui.WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".dCJp8.afkep.coreSpriteHeartOpen._0mzm-"))).click() File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/selenium/webdriver/support/wait.py", line 80, in until raise TimeoutException(message, screen, stacktrace) TimeoutException: Message:

我知道问题应该在 webdriver 等待,但我不知道如何改进我的脚本。

这是我的脚本:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import ui
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome(executable_path = '/usr/local/bin/chromedriver')
driver.implicitly_wait(30)
driver.get("https://www.instagram.com/accounts/login/?source=auth_switcher")

#log in 
time.sleep(1)
usm = driver.find_element_by_name('username').send_keys("givcomomvrvglino")
pwd = driver.find_element_by_name('password').send_keys("x")
btnLog = driver.find_element_by_tag_name('form').submit()

#disattiva le notifiche
ui.WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.CSS_SELECTOR,".aOOlW.HoLwm"))).click()

tag = "likeforfollow"

url_to_search = "https://www.instagram.com/explore/tags/" + tag + "/"

driver.get(url_to_search)

contatore = 0

for i in range(500):
  if i == 0:
        ui.WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".v1Nh3.kIKUG._bz0w"))).click()
        ui.WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".dCJp8.afkep.coreSpriteHeartOpen._0mzm-"))).click()
        ui.WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".HBoOv.coreSpriteRightPaginationArrow"))).click()

  else:
        ui.WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".dCJp8.afkep.coreSpriteHeartOpen._0mzm-"))).click()
        ui.WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".HBoOv.coreSpriteRightPaginationArrow"))).click()

  contatore = contatore + 1

  print(contatore)

  time.sleep(3)

【问题讨论】:

  • 您是否尝试增加等待时间?指定值以秒为单位,条件(默认)每 0.5 秒轮询一次。
  • 我是 Selenium 新手,我不知道该怎么做
  • ui.WebDriverWait(driver, 20) 中,“20”是以秒为单位的等待时间。
  • 我试过了,还是一样

标签: python reactjs selenium selenium-webdriver instagram


【解决方案1】:

正如您所提到的,shell 有时会在一些喜欢后(一次 14、一次 50、一次 64)给出此错误,因此实际上似乎没有明确/具体的错误。

如果您查看 InstagramDOM Tree

  • css 包含对 react-root

    的引用
    <style type="text/css" data-isostyle-id="786433">#react-root,article,div,footer,header,main,nav,section{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;border:0 solid #000;-webkit-box-sizing:border-box;box-sizing:border-box;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0;padding:0;position:relative}</style>
    
  • &lt;body&gt;&lt;span&gt; 标记开头,其中包含 react-root,如下所示:

    <span id="react-root">
    

因此,您的 Locator Strategies 是基于这些动态类,例如v1Nh3kIKUG_bz0w_0mzm- 等,在您的测试执行期间,无论是过早还是稍晚,对元素的搜索都会失败。


解决方案

一个适当的解决方案是使用基于HTML DOM 中存在的satic 元素定位策略

click() 为例,在 Instagram 弹出通知 上带有 Not now 文本的元素上,您可以使用以下解决方案:

WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[contains(.,'Not Now')]"))).click()

您可以在Click ''Not now" on Instagram notifications ask using Selenium and Python找到详细讨论

【讨论】:

    猜你喜欢
    • 2021-11-24
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    相关资源
    最近更新 更多