2017-06-22 33 views
0

我的困境是,如果我使用遍歷洗牌WebElements的陣列沒有他們獲得舊

a=[] 
a=driver.find_elements_by_class_name("card") 
random.shuffle(a) 
for card in a: 
    nextup=(str(card.text) + '\n' + "_" * 15) 
    do a bunch of stuff that takes about 10 min 

第一輪作品,但後來我得到一個StaleElementException因爲它點擊鏈接,進入頁面差異。於是我切換到這一點:

a=[] 
a=driver.find_elements_by_class_name("card") 
i=0 
cardnum=len(a) 
while i != cardnum: 
    i += 1 #needed because first element thats found doesnt work 
    a=driver.find_elements_by_class_name("card") #also needed to refresh the list 
    random.shuffle(a) 
    nextup=(str(card.text) + '\n' + "_" * 15) 
    do a bunch of stuff that takes about 10 min 

與這一個問題是我的變量,因爲在同一張卡可以點擊由於每次循環的洗牌。然後我添加了一個catch來檢查卡片是否已經被點擊,如果有卡片,繼續。聽起來像它會工作,但可悲的是,我變量計數這些,然後最終計數過去的指數。我想週期性地讓我回到1,但我不知道它是否會起作用。編輯:會做一個無限循環,因爲一旦所有點擊,我將是零,它將永遠不會退出。

我知道代碼的工作原理已經被廣泛測試,但是,機器人被禁止不被人類和隨機使用。這個腳本的基礎知識是通過一個類別列表,然後通過一個類別中的所有卡片。試圖隨機化的類別,但類似的困境,因爲刷新列表,你必須在每個循環像上述塊重做數組然後出現類別已完成的問題將再次點擊...任何意見將不勝感激。

+0

你能顯示確定卡片是否被點擊的代碼?我想你只需要在那裏添加更多的條件。 (1)添加循環的最大數量。 (2)設i = i-1。 – Buaban

+0

@Buaban如果「看」在nextup: –

回答

0

這裏發生的事情是,當您與頁面交互時,DOM會被刷新,最終導致您存儲的元素過時。

而不是保持元素的列表,請參考他們的個人元素路徑,並根據需要重新獲取的元素:

# The base css path for all the cards 
base_card_css_path = ".card" 

# Get all the target elements. You are only doing this to 
# get a count of the number of elements on the page 
card_elems = driver.find_elements_by_css_selector(base_card_css_path) 

# Convert this to a list of indexes, starting with 1 
card_indexes = list(range(1, len(card_elems)+1)) 

# Shuffle it 
random.shuffle(card_indexes) 

# Use `:nth-child(X)` syntax to get these elements on an as needed basis 
for index in card_indexes: 
    card_css = base_card_css_path + ":nth-child({0})".format(index) 
    card = driver.find_element_by_css_selector(card_css) 
    nextup=(str(card.text) + '\n' + "_" * 15) 
    # do a bunch of stuff that takes about 10 min 

(以上是未經考驗的原因很明顯)

+0

感謝這工作 –