Selenium Webdriver Practical Guide

selenium%20webdriver%20practical%20guide

User Manual:

Open the PDF directly: View PDF PDF.
Page Count: 264

DownloadSelenium Webdriver Practical Guide
Open PDF In BrowserView PDF
#

\

I

A

M

Community

Experience

Distilled

Selenium WebDriver
Practical Guide
Interactively automate web applications using Selenium WebDriver

Satya Avasarala

PACKT

PUBLISHING

1I open sourceÿ
community experience cTistHied

Selenium WebDriver
Practical Guide

Interactively automate web applications using
Selenium WebDriver

Satya Avasarala

1I open source

f

I

community experience distilled

PUBLISHING
BIRMINGHAM - MUMBAI

Selenium WebDriver Practical Guide
Copyright © 2014 Packt Publishing

All rights reserved. No part of this book may be reproduced, stored in a retrieval
system, or transmitted in any form or by any means, without the prior written
permission of the publisher, except in the case of brief quotations embedded in
critical articles or reviews.
Every effort has been made in the preparation of this book to ensure the accuracy
of the information presented. However, the information contained in this book is
sold without warranty, either express or implied. Neither the author, nor Packt
Publishing, and its dealers and distributors will be held liable for any damages
caused or alleged to be caused directly or indirectly by this book.
Packt Publishing has endeavored to provide trademark information about all of the
companies and products mentioned in this book by the appropriate use of capitals.
However, Packt Publishing cannot guarantee the accuracy of this information.

First published: January 2014

Production Reference: 1170114

Published by Packt Publishing Ltd.
Livery Place
35 Livery Street
Birmingham B3 2PB, UK.
ISBN 978-1-78216-885-0
www.packtpub.com

Cover Image by Prashant Timappa Shetty (sparkling.spectrum.123@gmail.com)

Credits
Author
Satya Avasarala
Reviewers
Anuj Chaudhary

Project Coordinator
Amey Sawant
Proofreader
Clyde Jenkins

David Askirk Fotel
Daniel Lam
Ripon Al Wasim
Acquisition Editors
Anthony Albuquerque

Indexers
Hemangini Bari
Monica Ajmera Mehta
Rekha Nair
Priya Subramani

Richard Harvey
Graphics
Lead Technical Editor
Priya Singh
Technical Editors
Dennis John

Yuvraj Mannari
Abhinash Sahu
Production Coordinator
Aparna Bhagat

Venu Manthena
Gaurav Thingalaya
Copy Editors
Tanvi Gaitonde
Kirti Pai
Adithi Shetty

Cover Work
Aparna Bhagat

About the Author
Satya Avasarala has rich experience in Java development and automation testing.

He is an engineer in computer science. He has used WebDriver for many years
now and has created several good automation frameworks. He has worked at
various large software enterprises such as Oracle Corp, Yahoo! Inc., VMware Inc.,
and the REA Group.
In addition, he is also interested in Service Oriented Architectural design and
%XVLQHVV,QWHOOLJHQFH+HLVDQ2UDFOHFHUWLÀHG6HUYLFH2ULHQWHG$UFKLWHFWXUH
Infrastructure Implementation Expert and a Business Intelligence Foundation
Suite Implementation Specialist.
I would like to thank all my acquisition editors, technical editors,
and project coordinators for constantly supporting me in completing
this book. I should also thank my colleagues, Pratik Patil and Kerri
Rusnak, for their constant encouragement and support in writing
this book. Last but not least, I would like to thank my wife, Swathi
9HQQHODJDQWLIRUVDFULÀFLQJPDQ\ZHHNHQGVZKLOH,ZDVEXV\
writing this book. Without all these people, this book wouldn't have
been a reality.

About the Reviewers
Anuj Chaudhary is a software engineer who enjoys working on software testing

and automation. He has a vast experience with various testing methodologies such
as manual testing, automated testing, performance testing, and security testing. He
has worked as an individual contributor and technical lead on various software
projects dealing with all of the stages in the application development life cycle.

He has been awarded the title of Microsoft MVP twice in a row. He writes a blog that
you can visit at www.anujchaudhary.com.
I would like to thank and congratulate the Packt Publishing team for
publishing this awesome book.

David Askirk Fotel has worked with computers since his parents brought
home an old, used IBM PS/2. He started his development career writing simple
programs in QBasic and later in Pascal. From there, he moved on to writing
programs in C. Later on, he moved on to Java and other languages. His greatest
experience so far was with Lisp, which had a great impact on his programming
style and approach to code.
David has worked on test-driven development and as a test manager, implementing
Selenium tests on an e-learning system.
7KLVERRNLVWKHÀUVWRQZKLFK'DYLGKDVZRUNHGEXWZLOOQRWEHWKHODVW

Daniel Lam is an Agile Test Developer with experience in open and closed source
test tools. He specializes in Java, Selenium WebDriver, Continuous Integration, and
BDD test frameworks.

Ripon Al Wasim is a software engineer living in Dhaka, Bangladesh. He has 12
years' experience in the software industry, three years in software development,
and nine years in software testing (both manual and automated). He has also been
involved in conducting software testing courses in various companies. He has
worked for clients in various countries such as Japan, USA, Finland, Norway, and
Bangladesh.
Ripon started participating in posting professional questions and answers on Stack
2YHUÁRZLQWKH\HDUDWhttp://stackoverflow.com/users/617450/riponal-wasim.
5LSRQLVD6XQ&HUWLÀHG-DYD3URJUDPPHU 6&-3 +HLV-DSDQHVH/DQJXDJH
3URÀFLHQF\7HVW -/37 /HYHOFHUWLÀHGDQGLVDOLWWOHIDPLOLDUZLWK-DSDQHVHFXOWXUH
DVKHVWD\HGLQ-DSDQIRURQH\HDUDVDQ,7SURIHVVLRQDO7KLVERRNLV5LSRQ VÀUVW
RIÀFLDOHIIRUW
I would like to thank my mother and wife for fostering a helping
and inspiring environment at home so I could study and review.
I am also deeply thankful and grateful to Cefalo Amravi Ltd.
(http://cefalo.com/en), my current company, for providing me
a good opportunity to work with automated testing using Selenium
WebDriver. I would like to thank Yves Hwang, Product Manager
at Varnish Software (https://www.varnish-software.com/) and
Partha Guha Roy, CTO of Cefalo Amravi Ltd. for providing technical
assistance during my project work.

www.PacktPub.com
6XSSRUW¿OHVH%RRNVGLVFRXQWRIIHUVDQGPRUH

You might want to visit www.PacktPub.comIRUVXSSRUWÀOHVDQGGRZQORDGVUHODWHG
to your book.
Did you know that Packt offers eBook versions of every book published, with PDF
DQGH3XEÀOHVDYDLODEOH"
Goggle

0
<>
H

|

body

Edit

Console

HTML

"•

CSS

Script

html

DOM

phone.

* *

QnumlAailf-

•

Search
Fast. Smart. Safe. It's never been easier to put Firefox on your Android

Net

fiAnkmaikt.

©

ft

Wirtnni

JWMÿnr.

v

Cm,

Cookies

Style




Computed

body {

Layout

DOM

aboutHome.css (line 10)

*

-muz -box-

5 

orient: vertical;



backgroundimage: url ( "chrome ://brc

15 Oft
/content/abouthome
/noise .png”) , lineargradient (rgba <255, 255, 5 1 matching node [5s I Downloading WebDriver client library (language bindings) As discussed earlier, test scripts need a client library with which to interact, or FRPPDQG:HE'ULYHUWRH[HFXWHVSHFLÀFXVHUHYHQWVDJDLQVWDZHEDSSOLFDWLRQ being tested on a browser. For this, you need to download the WebDriver client library. In this book, we use Java language bindings to create and execute our automation scripts. [5] Preface At the time of writing this book, all the code examples are written based on Selenium Java Version 2.33.0. It is recommended that you download that version from the following location: https://code.google.com/p/selenium/downloads/detail?name=seleniumjava-2.33.0.zip&can=2&q= Downloading the Firefox Driver The good news is that you have already downloaded the Firefox Driver. Yes, the Firefox Driver comes along with client libraries. But, for other drivers, such as the IE Driver, Safari Driver, Chrome Driver, and so on, you have to download them explicitly from the following link: http://docs.seleniumhq.org/download/ We will download them when we need to in Chapter 4, Different Available WebDrivers. Who this book is for If you are a quality assurance/testing professional, software developer, or web application developer looking to create automation test scripts for your web applications, this is the perfect guide for you! As a prerequisite, this book expects you to have a basic understanding of Java programming, although any previous knowledge of WebDriver or Selenium 1 is not needed. By the end of this book, you will have acquired a comprehensive knowledge of WebDriver, which will help you in writing your automation tests. Conventions ,QWKLVERRN\RXZLOOÀQGDQXPEHURIVW\OHVRIWH[WWKDWGLVWLQJXLVKDPRQJGLIIHUHQW kinds of information. Here are some examples of these styles, and an explanation of their meaning. &RGHZRUGVLQWH[WGDWDEDVHWDEOHQDPHVIROGHUQDPHVÀOHQDPHVÀOHH[WHQVLRQV pathnames, dummy URLs, user input, and Twitter handles are shown as follows: "The moveByOffset() method is used to move the mouse from its current position to another point on the web page." A block of code is set as follows: public class NavigateToAUrl { public static void main(String[] args){ WebDriver driver = new FirefoxDriver(); [] Preface driver.get("http://www.google.com"); } } When we wish to draw your attention to a particular part of a code block, the relevant lines or items are set in bold: public class GoogleSearchButtonByName { public static void main(String[] args){ WebDriver driver = new FirefoxDriver(); driver.get("http://www.google.com"); WebElement searchBox = driver.findElement(By.name("btnK")); searchBox.submit(); } } Any command-line input or output is written as follows: java -jar selenium-server-standalone-2.33.0.jar -role node -hub http://172.16.87.131:1111/grid/register -registerCycle 10000 New terms and important words are shown in bold. Words that you see on the screen, in menus or dialog boxes for example, appear in the text like this: "Open Eclipse from the directory you have installed it in earlier. Navigate to File | New | Java Project". Warnings or important notes appear in a box like this. Tips and tricks appear like this. 1 1 Reader feedback Feedback from our readers is always welcome. Let us know what you think about this book—what you liked or may have disliked. Reader feedback is important for us to develop titles that you really get the most out of. To send us general feedback, simply send an e-mail to feedback@packtpub.com, and mention the book title via the subject of your message. If there is a topic that you have expertise in and you are interested in either writing or contributing to a book, see our author guide on www.packtpub.com/authors. [] Preface &XVWRPHUVXSSRUW Now that you are the proud owner of a Packt book, we have a number of things to help you to get the most from your purchase. 'RZQORDGLQJWKHH[DPSOHFRGH _ Test Script using Client libraries in Java, Python, Ruby, and so on. js 4 Selenium Remote Control Server m js Browsers loaded with Selenium Core JavaScript on them 3. Upon loading on the browser, Selenium Core executes all the Selenese commands from the test script, coming through Selenium RC, against the WAUT. The browser doesn't restrict it, because it treats Selenium Core and WAUT as a part of the same domain. >_ Selenese Command to be executed on WAUT Selenese Command to be executed on WAUT Test Script using Client libraries in Java, Python, Ruby, and so on. 4 Treated as same Domain js _7* > WAUT Selenium Core Selenium Remote Control Server [ 11 ] Introducing WebDriver and WebElements 4. Now comes the HTTP Proxy part of the Selenium RC server. All the requests and responses of the browser for WAUT go to the actual web server via Selenium RC server, because the browser thinks Selenium RC is serving WAUT. Selenium Remote Control Server (acting as HTTP Proxy) Request 4 Request Response Response J js + WAUT wmm\ Selenium Core V Browser making request to Selenium RC 4 Actual Web server hosting WAUT 5. After execution, Selenium RC will send out the test result back to the test script for developer's analysis. 6HOHQLXPRU6HOHQLXP:HE'ULYHURU WebDriver To overcome some of the limitations of Selenium 1, which we are going to discuss shortly, WebDriver has come into existence for the following reasons: ‡ 7RJLYHDEHWWHUFRQWURORQWKHEURZVHUE\LPSOHPHQWLQJEURZVHUVSHFLÀF implementations. ‡ To give a better programming experience to the developer by adhering more closely to the object-oriented programming fundamentals. It works in the following way: 1. A tester or developer, through his/her test script, can command WebDriver to perform certain actions on the WAUT on a certain browser. The way the user can command WebDriver to perform something is by using the client libraries or language bindings provided by WebDriver. These libraries are provided in different languages, such as Java, Ruby, Python, Perl, PHP, and .NET. [] Chapter 1 2. By using the language-binding client libraries, developers can invoke the EURZVHUVSHFLÀFLPSOHPHQWDWLRQVRI:HE'ULYHUVXFKDV)LUHIR['ULYHU,( Driver, Opera Driver, and so on, to interact with the WAUT on the respective EURZVHU7KHVHEURZVHUVSHFLÀFLPSOHPHQWDWLRQVRI:HE'ULYHUZLOOZRUN with the browser natively and execute commands from outside the browser to simulate exactly how the application user does. 3. After execution, WebDriver will send out the test result back to the test script for developer's analysis. \ c? Request-Response Firefox Driver Q >_ + Test Script using WebDriver Client libraries supported in Java, Ruby, Python, and so on. © IE Driver r Request-Response S Web Server hosting WAUT Request-Response 4 Chrome Driver Browsers WebDriver’s Browser-specific Implementations 'LIIHUHQFHVEHWZHHQ6HOHQLXPDQG 6HOHQLXP Now that we know how Selenium 1 and Selenium 2 are designed, let's quickly see the differences between them. [] Introducing WebDriver and WebElements Handling the browser As we saw earlier, Selenium RC drives the browser from within the browser by sitting in it as JavaScript (Selenium Core). All the events that are to be executed on the WAUT go through Core. This kind of approach will come with some limitations, such as: ‡ Core being limited within the JavaScript sandbox of the browser, as it needs to comply with the Same-Origin policy. ‡ %HFDXVHWKLV-DYD6FULSWOLEUDU\LVJHQHULFDQGQRWVSHFLÀFWRDQ\SDUWLFXODU browser, the developers of test scripts sometimes end up with a situation where their test scripts execute very well on some browsers but not on some other. To overcome this limitation, WebDriver, on the other hand, handles the browser from outside the browser. It has an implementation for each browser, and the developer who wants to execute his/her tests on a particular browser should use that particular implementation of WebDriver. This gives the test scripts a better handle on the browser because these WebDriver implementations speak to the browsers natively, thus increasing the robustness of the test scripts. Having better APIs WebDriver comes with a better set of APIs meeting the expectations of most developers by being closer to the object-oriented programming in terms of its implementation. 7HVWLQJPRELOHDSSV 8VLQJ:HE'ULYHU VPRELOHVSHFLÀFLPSOHPHQWDWLRQVVXFKDV,3KRQH'ULYHUDQG AndroidDriver, developers can actually generate test scripts that can execute their mobile applications on simulators/emulators and actual devices. Selenium RC doesn't support mobile application testing. Having developer support and advanced functionalities WebDriver is being actively developed over a period of time, and you can see many advanced interactions with the web as well as mobile applications, such as File Handling, Touch APIs, and so on. The API set of it is getting bigger and bigger ZLWKORWVRIIHDWXUHVZKLFKZHUHQHYHUWKRXJKWDERXWLQ6HOHQLXP5&'HÀQLWHO\ it is the future! [] Chapter 1 Setting up a project in Eclipse Now, let's VHWXSRXUSURMHFWLQ(FOLSVHDQGZULWHRXUÀUVW piece of code to use WebDriver and navigate to a web page. Please follow the sequence of the following steps to create an Eclipse WebDriver project: 1. Open Eclipse from the directory you have installed it in earlier. Navigate to File | New | Java Project. 2. A New Java Project dialog appears, as shown in the following screenshot. Enter the project name of your choice, leave the rest to default, and click Next. Jte n New Java Project A : Create a Java Project Create a Java project in the workspace or in an external location. Project name: Learning-WebDriver @ Use default location Location: C:\workspace\Learning-WebDriver Browse... JRE (•) Use an execution environment JRE: JavaSE-1.7 O Use a project specific JRE: jre7 v v O Use default JRE (currently 'jre7') Configure JREs... Project layout O Use project folder as root for sources and class files (•) Create separate folders for sources and class files Configure default... Working sets l~1 Add project to working sets v Working sets: < Back Next > [ 15 ] Finish Select... Cancel Introducing WebDriver and WebElements 3. In the next screen, go to the Libraries tab, click on the Add External JARs… button, and select selenium-java-2.33.0.jar and selenium-java-2.33.0srcs.jarÀOHVIURPWKHGRZQORDGHGORFDWLRQRI6HOHQLXP:HE'ULYHU % n New Java Project & Java Settings Define the Java build settings. 13 Source | U3 Projects Libraries Order and Export JARs and class folders on the build path: selenium-java-2.33.0-srcs.jar - C:\Selenium2.33.0\seh selenium-java-2.33.0.jar - C:\Selenium2.33.0\seleniur B, JRE System Library [JavaSE-1.7] Add JARs... oio oio [> Add External JARs... Add Variable... Add Library... Add Class Folder... Add External Class Folder... Edit... Remove Migrate JAR File... < > < Back Next > [] Finish Cancel Chapter 1 4. Click on the Add External JARs… button and add all the jars available under the libs folder of the Selenium WebDriver directory(). Now the Libraries section should look like this: A n New Java Project Java Settings & Define the Java build settings. Source Projects — Libraries •%. Order and Export JARs and class folders on the build path: > IOIO apache-mime4j-0.6.jar - C:\Selenium2.33.0\seleni Add JARs... A - t> ioi IOIO t> oio t> oio t> oio [> IOIO t> § t> t> § t> t> § IOIO > 5 > 5: t> IOTO »S t> t> S § t> ioTo cglib-nodep-2.1_3.jar - C:\Selenium2.33.0\seleniu commons-codec-1.6.jar - C:\Selenium2.33.0\seler commons-collections-3.2.1.jar - C:\Selenium2.33. commons-exec-1.1.jar - C:\Selenium2.33.0\selenii commons-io-2.2.jar - C:\Selenium2.33.0\seleniurr commons-jxpath-1.3.jar - C:\Selenium2.33.0\seler commons-lang3-3.1.jar - C:\Selenium2.33.0\selen commons-logging-1.1.1.jar - C:\Selenium2.33.0\s cssparser-0.9.9.jar - C:\Selenium2.33.0\selenium-i guava-14.0.jar - C:\Selenium2.33.0\selenium-2.33. hamcrest-core-1.3.jar - C:\Selenium2.33.0\seleniu hamcrest-library-1.3.jar - C:\Selenium2.33.0\selen htmlunit-2.12.jar - C:\Selenium2.33.0\selenium-2. htmlunit-core-js-2.12.jar - C:\Selenium2.33.0\sele httpclient-4.2.1.jar - C:\Selenium2.33.0\seleniumhttpcore-4.2.1.jar - C:\Selenium2.33.0\selenium-2 httpmime-4.2.1.jar - C:\Selenium2.33.0\seleniumini4j-0.5.2.jar - C:\Selenium2.33.0\selenium-2.33.0 jcommander-1.29.jar - C:\Selenium2.33.0\seleniut jetty-websocket-8.1.8.jar - C:\Selenium2.33.0\sele 0 ioTo 0 ioTo IoTo ina-3.4.0.iar - C:\Selenium2.33.0\selenium-2.33.0\ v r> < Back Next > 5. Click on Finish. [] Add External JARs... Add Variable... Add Library... Add Class Folder... Add External Class Folder... EditRemove Migrate JAR File... Finish Cancel Introducing WebDriver and WebElements 6. Now,OHW VFUHDWHRXUÀUVWFODVVWKDWXVHV:HE'ULYHUWRQDYLJDWHWRDZHE page. In the project explorer window of Eclipse, right-click and navigate to src | New | Class, enter the details of the class name and package name, as shown in the following screenshot, and then click on Finish: New Java Class Java Class Q Create a new Java class. Source folder Learning-WebDriver/src Browse... Package: com.packt.webdriver.chapterl Browse... I I Enclosing type: Browse... Name: | NavigateToAUrl| Modifiers: (•) public O default I I abstract Q final Superclass: private protected D static Browse... java.lang.Object interfaces: Add... Remove Which method stubs would you like to create? I I public static void main(String[] args) O Constructors from superclass [ÿ1Inherited abstract methods Do you want to add comments? (Configure templates and default value here) | I Generate comments Finish Cancel 7. TheÀUVWSLHFHRIFRGHWRLQYRNH:HE'ULYHUand navigate to a URL is as follows: package com.packt.webdriver.chapter1; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; public class NavigateToAUrl { public static void main(String[] args){ WebDriver driver = new FirefoxDriver(); driver.get("http://www.google.com"); } } [] Chapter 1 Downloading the example code You can download the example code files for all Packt books you have purchased from your account at http://www. packtpub.com. If you purchased this book elsewhere, you can visit http://www.packtpub.com/support and register to have the files e-mailed directly to you. Lets look at each line of code. Line 1 is the name of the package in which \RXUFODVVÀOHLVJRLQJWRUHVLGHOLQHVDQGLPSRUWQHFHVVDU\:HE'ULYHU classes that we are going to explore, line 4 is the class declaration, and line 5 is the start of the main method. Now, coming to the important part of the code: WebDriver driver = new FirefoxDriver(); Line 6 is where we instantiate the Firefox implementation of the WebDriver interface. WebDriver is an interface whose concrete implementation is done in two classes: RemoteWebDriver and HtmlUnitDriver. We will talk about the RemoteWebDriver and HtmlUnitDriver classes more in depth later in this book, but right now knowing them as implementations of the WebDriver LQWHUIDFHLVVXIÀFLHQWFirefoxDriver is a subclass of the RemoteWebDriver class, which extends the RemoteWebDriver FODVVPRUHVSHFLÀFDOO\IRUWKH)LUHIR[EURZVHU6LPLODUO\ZHKDYHWKH InternetExplorerDriver, ChromeDriver, SafariDriver, AndroidDriver, and IPhoneDriverFODVVHVZKLFKDUHVSHFLÀFLPSOHPHQWDWLRQVIRUWKH UHVSHFWLYHEURZVHUVDQGGHYLFHV7KHIROORZLQJÀJXUHVKRZVWKHKLHUDUFK\ of the classes: WebDriver A RemoteWebDriver FirefoxDriver InternetExplorerDriver SafariDriver ChromeDriver AndroidDriver IPhoneDriver Let's now look at the last line of the code: driver.get("http://www.google.com"); [] HtmlUnitDriver Introducing WebDriver and WebElements In the preceding code, we use one of the methods of the WebDriver interface called the get() method to make the browser load the requested web page on it. If the browser, in this case Firefox, is not already opened, it will launch a new browser window. 8. Now, execute your code by navigating to Run | Run or using the Ctrl + F11 shortcut. A Firefox browser should open and load the Google Search page in your browser. :HE(OHPHQWV A web page is comprised of many different HTML elements, such as buttons, links, a body, labels, forms, and so on, that are named WebElements in the context of WebDriver. Together, these elements on a web page will achieve the business functionality. For example, let's look at the HTML code of the login page of a website.
Forgot Password ? In the preceding HTML code, there are different types of WebElements such as , ,
,

Source Exif Data:
File Type                       : PDF
File Type Extension             : pdf
MIME Type                       : application/pdf
PDF Version                     : 1.6
Linearized                      : No
Create Date                     : 2014:01:20 15:55:26+05:30
Creator                         : Adobe InDesign CS6 (Windows)
Modify Date                     : 2014:01:20 16:07:28+05:30
Tagged PDF                      : Yes
XMP Toolkit                     : Adobe XMP Core 5.2-c001 63.139439, 2010/09/27-13:37:26
Instance ID                     : uuid:f2f86707-1900-4661-8ade-c0dbe93128c6
Original Document ID            : adobe:docid:indd:4992da54-27df-11de-a18e-f5498a2a904f
Document ID                     : xmp.id:EE9D1C96BB81E31197178B7C0ACD869D
Rendition Class                 : proof:pdf
Derived From Instance ID        : xmp.iid:88B20B47867FE3119751AF4DD3B25F7E
Derived From Document ID        : xmp.did:9488249FE579E311ACD7ECF289353A7A
Derived From Original Document ID: adobe:docid:indd:4992da54-27df-11de-a18e-f5498a2a904f
Derived From Rendition Class    : default
History Action                  : converted
History Parameters              : from application/x-indesign to application/pdf
History Software Agent          : Adobe InDesign CS6 (Windows)
History Changed                 : /
History When                    : 2014:01:20 15:55:26+05:30
Metadata Date                   : 2014:01:20 16:07:28+05:30
Creator Tool                    : Adobe InDesign CS6 (Windows)
Format                          : application/pdf
Producer                        : Adobe PDF Library 10.0.1
Trapped                         : False
Page Count                      : 264
EXIF Metadata provided by EXIF.tools

Navigation menu