2017-06-28 6 views
0

Ich benutze Selen, um Seite Daten zu crawlen, sollte einige Aktion auf Seite wie folgt durchgeführt werden: 1. Suchen Sie ein Element und klicken Sie darauf, klicken Sie auf eine js funtion 2. über js Funktion Änderung Tag a's href Ventil, ich sollte die neue href bekommen. Allerdings habe ich versagt, Href Wert bleibt egal! Hier sind die Codepizes.Selen kann nicht geändert werden Attributwert

class wait_for_href_changed(object): 
def __init__(self, locator, old): 
    self.locator = locator 
    self.href = old 

def __call__(self, driver): 
    try: 
     element_href = EC._find_element(driver, self.locator).get_attribute('href') 
     return element_href != self.href 
    except : 
     return False 

.....

for i in range(1,3): 
     for j in range(1,10): 
      try: 


       old_href = self.driver.find_element_by_xpath('//*[@id="mainTable"]/tbody[1]/tr/td/table/tbody/tr/td[1]/table/tbody/tr/td[2]/a').get_attribute('href') 
       nexts = self.driver.find_element_by_xpath('//*[@id="secTable"]/tbody/tr['+str(i)+']/td['+str(j)+']') 
       nexts.click() 

       #self.driver.execute_script('arguments[0].click()',nexts) 

       element = WebDriverWait(self.driver, 10).until(
        wait_for_href_changed((By.XPATH, '//*[@id="mainTable"]/tbody[1]/tr/td/table/tbody/tr/td[1]/table/tbody/tr/td[2]/a'),old_href)) 

       target = element.get_attribute('href') 

       yield Request(target,callback=self.parse2) 

      except: 
       break 

Antwort

0

IMHO Sie nicht warten auf die href, nur ein einziges Mal zu ändern, zu fragen, ob sie sich geändert hat. Es kann eine Weile dauern, bis der href geändert wird. Sie können das Warten simulieren, indem Sie fragen, ob es sich mehrmals geändert hat und ob Sie nicht eine Sekunde warten. Der Pseudocode sieht ungefähr so ​​aus:

int secs_to_wait := 5 
int secs_waited := 0 

while secs_waited < secs_to_wait do: 

    element_href = EC._find_element(driver,self.locator).get_attribute('href') 
    if element_href != self.href then: 
     return true 
    end if 

    Thread.Sleep(1000) 
    secs_waited++ 
end while 

return false; 
Verwandte Themen