Search code examples
python-3.xseleniumweibo

Weibo login in selenium in python?


I'm doing weibo login in selenium, but I can't handle window popup. This is my code. What is problem?

from selenium import webdriver

username = 'your id'
password = 'your password'

driver = webdriver.Firefox()
driver.get("http://overseas.weibo.com/")
driver.implicitly_wait(10)

handles = driver.window_handles


driver.find_elements_by_link_text('登入微博')[0].click()
driver.implicitly_wait(10)

driver.switch_to_alert()
driver.find_element_by_name('memberid').send_keys(username)
driver.find_element_by_name('passwd').send_keys(password)
driver.find_elements_by_link_text('登入')[0].click()

Traceback (most recent call last): File "D:/python34/weibo_login.py", line 35, in driver.find_element_by_name('memberid').send_keys(username) File "C:\Python34\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 362, in find_element_by_name return self.find_element(by=By.NAME, value=name) File "C:\Python34\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 744, in find_element {'using': by, 'value': value})['value'] File "C:\Python34\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 233, in execute self.error_handler.check_response(response) File "C:\Python34\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 194, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: {"method":"name","selector":"memberid"} Stacktrace: at FirefoxDriver.prototype.findElementInternal_ (file:///C:/Users/hena/AppData/Local/Temp/tmpwk788t0k/extensions/fxdriver@googlecode.com/components/driver-component.js:10770) at fxdriver.Timer.prototype.setTimeout/<.notify (file:///C:/Users/hena/AppData/Local/Temp/tmpwk788t0k/extensions/fxdriver@googlecode.com/components/driver-component.js:625)


Solution

  • Actually opened login form is inside an iframe. It's not an alert. You need to switch this particular iframe first before find element and sendKeys as below :-

    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
    
    username = 'your id'
    password = 'your password'
    
    driver = webdriver.Firefox()
    driver.get("http://overseas.weibo.com/")
    
    wait = WebDriverWait(browser, 10)
    
    link = wait.until(EC.visibility_of_element_located((By.LINK_TEXT, "登入微博")))
    link.click()   
    
    frame = wait.until(EC.visibility_of_element_located((By.CLASS_NAME, "cboxIframe")))
    driver.switch_to_frame(frame)
    
    user = wait.until(EC.visibility_of_element_located((By.ID, "memberid")))
    user.send_keys(username)
    
    passwd = wait.until(EC.visibility_of_element_located((By.ID, "passwd")))
    passwd.send_keys(password)
    
    button = wait.until(EC.visibility_of_element_located((By.ID, "login")))
    button.click()
    

    Hope it helps...:)