2017-12-17 2 views
1

Ich habe ein einfaches Skript, das zu einer Reihe von Seiten navigiert.Erstellen eines Seitenzählers in Python Selenium

Meine Frage ist, wie erstelle ich einen Seitenzähler, damit ich weiß, wo der Job für das ist?

Ideal wäre es lesen:

Page 5 
Page 4 #For each loop 

Die folgende neigt, zu arbeiten, wenn ich Fragen habe mit den folgenden:

elements = [x.get_text() for x in 
     wait(driver, 10).until(EC.element_to_be_clickable((By.XPATH,'(//div[div/div/text()="Main Lists"]//div[starts-with(@class, "sm-CouponLink_Label") and normalize-space()]')))] 

Verwandte Fehler:

line 36, in <module> 
     wait(driver, 10).until(EC.element_to_be_clickable((By.XPATH,'(//div[div/div/text()="Main Lists"]//div[starts-with(@class, "sm-CouponLink_Label") and normalize-space()]')))] 
     File "C:\Users\Django\AppData\Local\Continuum\miniconda3\lib\site-packages\selenium\webdriver\support\wait.py", line 80, in until 
     raise TimeoutException(message, screen, stacktrace) 
    selenium.common.exceptions.TimeoutException: Message: 

Voll Code :

import collections 
from random import shuffle 

from selenium import webdriver 
from selenium.common.exceptions import TimeoutException 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.support.ui import WebDriverWait as wait 

driver = webdriver.Chrome() 
driver.set_window_size(1024, 600) 
driver.maximize_window() 


driver.get('https://www.bet365.com.au/#/AS/B1/') 
driver.get('https://www.bet365.com.au/#/AS/B1/') 



def page_counter(): 
    for x in range(1000): 
     yield x 


clickMe = wait(driver, 10).until(EC.element_to_be_clickable((By.XPATH,'(//div[div/div/text()="Main Lists"]//div[starts-with(@class, "sm-CouponLink_Label") and normalize-space()])'))) 
options = driver.find_elements_by_xpath('//div[div/div/text()="Main Lists"]//div[starts-with(@class, "sm-CouponLink_Label") and normalize-space()]') 

indexes = [index for index in range(len(options))] 
shuffle(indexes) 
for index in indexes: 


    count = page_counter() 
    driver.get('https://www.bet365.com.au/#/AS/B1/') 
    elements = [x.get_text("*") for x in 
      wait(driver, 10).until(EC.element_to_be_clickable((By.XPATH,'(//div[div/div/text()="Main Lists"]//div[starts-with(@class, "sm-CouponLink_Label") and normalize-space()]')))] 


     #elements = [x.get_attribute("href") for x in 
     # driver.find_elements_by_xpath('//div[div/div/text()="Main Lists"]//div[starts-with(@class, "sm-CouponLink_Label") and normalize-space()]')))] 

    clickMe.click() 
    shuffle(elements) 

    links = dict((next(count) + 1, e) for e in elements) 

desc_links = collections.OrderedDict(sorted(links.items(), reverse=True)) 
for key, value in desc_links.items(): 
    try: 
     driver.get(value) 
     print('Page ' + str(key)) 
    except TimeoutException as ex: 
     pass 

Alternative:

import collections 
import time 

from selenium import webdriver 

driver = webdriver.Chrome() 
driver.set_window_size(1024, 600) 
driver.maximize_window() 

driver.get('https://www.bet365.com.au/#/AS/B1/') 

driver.find_element_by_id('TopPromotionBetNow').click() 


def page_counter(): 
    for x in range(1000): 
     yield x 


count = page_counter() 
time.sleep(10) 
classifications = driver.find_elements_by_class_name('wn-Classification') 
for classification in classifications: 
    if classification.text == 'Soccer': 
     classification.click() 
     break 

time.sleep(10) 
markets = driver.find_elements_by_class_name('sm-Market') 
for market in markets: 
    group_name = market.find_element_by_class_name('sm-Market_GroupName') 
    if group_name.text == 'Main Lists': 
     coupon_lables = [x for x in market.find_elements_by_class_name('sm-CouponLink_Label')] 
    break 

coupon_lables = [x.text for x in market.find_elements_by_class_name('sm-CouponLink_Label')] 

links = dict((next(count) + 1, e) for e in coupon_lables) 

desc_links = collections.OrderedDict(sorted(links.items(), reverse=True)) 
for key, value in desc_links.items(): 

    for label in coupon_lables: 
     print('Page ' + str(key)) 
     print('executing:' + label) 
     time.sleep(5) 
     driver.find_element_by_xpath(f'//div[contains(text(), "' + label + '")]').click() 
     time.sleep(5) 
     driver.find_element_by_class_name('cl-BreadcrumbTrail_BackButton').click() 

Meine Ausgabe:

Page 12 
executing:UK Saturday's Matches 
Page 12 
executing:Spanish Saturday's Matches 
Page 12 
executing:Italian Saturday's Matches 
Page 12 
executing:International Saturday's Matches 
Page 12 
executing:Europe Saturday's Matches 

Wunsch:

Page 12 
Page 11 
Page 10 

Jede Idee, wie ich dieses Problem beheben kann

+0

nur überprüfen [ von hier] (https://sites.google.com/a/chromium.org/chromedriver/downloads), wenn die Version von chromedriver.exe die aktuelle Browserversion auf Ihrem Computer unterstützt. –

+0

* Ich habe Probleme mit dem folgenden: * Und was ist das Problem? Ihre Frage ist nicht klar, bitte formulieren Sie sie um. – Guy

+0

@Guy Ich habe meinen Fehlercode hinzugefügt. –

Antwort

0

Der Code sollte dies wie folgt aussehen:

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 
import sys, time 
driver = webdriver.Chrome() 
driver.get('https://www.bet365.com.au/#/AS/B1/') 

try: 
    WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.ID, 'TopPromotionInfo'))).click() 
except: 
    print("Unexpected error:", sys.exc_info()[0]) 


try: 
    elements = WebDriverWait(driver, 25).until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'wn-Classification'))) 
    for element in elements: 
     if 'Soccer' in element.text: 
      element.click() 
      break 
except: 
    print("Unexpected error:", sys.exc_info()[0]) 

market = [] 

try: 
    market = WebDriverWait(driver, 25).until(EC.presence_of_all_elements_located((By.XPATH, "//div[@class='sm-MarketGroup ']/div[@class='sm-MarketGroup_Open ']/div[@class='sm-Market ']"))) 
except: 
    print("Unexpected error:", sys.exc_info()[0]) 

for m1 in market: 
    if 'Main Lists' in m1.find_element_by_class_name('sm-Market_GroupName ').text: 
     elements = m1.find_elements_by_class_name('sm-CouponLink ') 
     labels = [x.text for x in elements] 
     c=0 
     for label in labels: 
      c+=1 
      print('Executing... ', c, len(labels)) 
      driver.find_element_by_xpath('//div[contains(text(),"' + label +'")]').click() 
      time.sleep(5) 
      WebDriverWait(driver, 25).until(EC.presence_of_element_located((By.CLASS_NAME, 'cl-BreadcrumbTrail_BackButton '))).click() 
      time.sleep(5) 
     break 
+0

Der Code zählt nicht korrekt vorausgesetzt, dass das herausgenommen wird, muss ich es vielleicht von scratc neu schreiben h. –

+0

Ändern Sie den Code, der neue Code sollte helfen und es ist sehr ähnlich zu dem Code, den Sie bereits haben. – Gabriel

+0

Etwas besser, aber immer noch etwas aufgebläht. Ich hätte fast mein Skript für diese Seite arbeiten lassen. Ich gehe schlafen –

1

Ihre xpath ist nicht gültig, Sie müssen die öffnende Klammer von ihm

'(//div[div/div/text()="Main Lists"]//div[starts-with(@class, "sm-CouponLink_Label") and normalize-space()])' 
^ remove this 

sein sollte

'//div[div/div/text()="Main Lists"]//div[starts-with(@class, "sm-CouponLink_Label") and normalize-space()])' 

Die interessante Sache entfernen ist, warum Sie nicht InvalidSelectorException bekommen haben. Mit Blick auf expected_conditionssource code können Sie sehen, element_to_be_clickable verwendet visibility_of_element_located, die wiederum verwenden _find_element (im unteren Teil des Quellcodes definiert).

_find_elementWebDriverException fangen, so die InvalidSelectorException, die Sie auf das Problem lenken konnte, gefangen und Sie erhalten TimeoutException statt.

Edit

Zusätzlich element_to_be_clickable kehrt einzelne WebElement, es ist nicht möglich, darüber zu iterieren. Stattdessen können Sie visibility_of_all_elements_located

elements = [x.get_text("*") for x in 
    wait(driver, 10).until(EC.visibility_of_all_elements_located(...)) 

verwenden oder die Elemente lokalisieren Verwendung driver.find_elements und testen Sie die Elemente nacheinander in Schleife

elements = driver.find_elements_by_xpath(...) 
for element in elements: 
    wait(driver, 10).until(EC.element_to_be_clickable(element)) 
+0

Ich bekomme dieselbe Fehlermeldung. Ich habe früher gewartet, also wahrscheinlich ist das Problem: elements = [x.get_text() für x in ist nicht korrekt –

+1

@TheGman Wenn Sie es zuvor verwendet hatten Sie Klammern im 'xpath', so hat es funktioniert. In der zweiten haben Sie nur öffnende Klammern. – Guy

+0

Ich bekomme immer noch: TypeError: 'WebElement' Objekt ist nicht iterierbar. –

Verwandte Themen