clarkk
clarkk

Reputation: 27689

Selenium print page when loaded

How to print a page when loaded?

When doing this print driver.page_source.encode('utf-8') it seems like the output is the first page and not the search results

import sys
import time
import getopt
from pyvirtualdisplay import Display
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
from selenium.common.exceptions import TimeoutException

def start_display():
    display = Display(visible=0, size=(800, 600))
    display.start()
    return display

def init_driver():
    driver = webdriver.Firefox()
    driver.wait = WebDriverWait(driver, 5)
    return driver

def lookup(driver, argv):
    driver.get('http://www.google.dk')

    query = ''

    opts, args = getopt.getopt(argv, 'hg:d', ['query='])
    for opt, arg in opts:
        if opt == '--query':
            query = arg

    try:
        box = driver.wait.until(EC.presence_of_element_located(
            (By.NAME, 'q')))
        box.send_keys(query)
        button = driver.wait.until(EC.element_to_be_clickable(
            (By.NAME, 'btnG')))
        button.click()
        print driver.page_source.encode('utf-8')

    except TimeoutException:
        print>>sys.stderr, 'Box or Button not found in google.com'

if __name__ == '__main__':
    display = start_display()
    driver = init_driver()
    lookup(driver, sys.argv[1:])
    time.sleep(5)

    driver.quit()
    display.stop()

Upvotes: 0

Views: 604

Answers (2)

the-noob
the-noob

Reputation: 1342

You need to add a wait after clicking the search button btnG otherwise it won't wait for the XHR request to finish

try:
    box = driver.wait.until(EC.presence_of_element_located(
        (By.NAME, 'q')))
    box.send_keys(query)
    button = driver.wait.until(EC.element_to_be_clickable(
        (By.NAME, 'btnG')))
    button.click()

    driver.wait.until(EC.presence_of_element_located(
            (By.ID, 'resultStats')))

    print driver.page_source.encode('utf-8')

Upvotes: 1

Buaban
Buaban

Reputation: 5137

If your application update content after pageLoaded, you have to print page body instead of page_source.

See code below:

try:
    box = driver.wait.until(EC.presence_of_element_located(
        (By.NAME, 'q')))
    box.send_keys(query)
    button = driver.wait.until(EC.element_to_be_clickable(
        (By.NAME, 'btnG')))
    button.click()
    time.sleep(10)
    print driver.find_element_by_tag_name("body").get_attribute("innerHTML").encode('utf-8')

except TimeoutException:
    print>>sys.stderr, 'Box or Button not found in google.com'

Upvotes: 1

Related Questions