Programming Language Preference

 

Явные и неявные ожидания

Ожидание заставляет автоматизированную задачу перейти к следующему шагу только по истечении определённого периода времени.

Явные ожидания

Явные ожидания - это определяемые вами участки кода, ожидающие возникновения определенных условий в течение указанного периода времени перед выполнением следующих операций. В худшем случае это “Thread.sleep()”, устанавливающий в качестве условия ожидание истечения заданного отрезка времени. WebDriver предлагает удобные методы, позволяющие писать код, который будет ждать ровно столько, сколько необходимо. Один из них - “WebDriverWait” в сочетании с “ExpectedCondition”.

WebDriver driver = new FirefoxDriver();
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
  .until(new ExpectedCondition<WebElement>(){
	@Override
	public WebElement apply(WebDriver d) {
		return d.findElement(By.id("myDynamicElement"));
	}});
IWebDriver driver = new FirefoxDriver();
driver.Url = "http://somedomain/url_that_delays_loading";
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IWebElement myDynamicElement = wait.Until<IWebElement>((d) =>
    {
        return d.FindElement(By.Id("someDynamicElement"));
    });
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait # available since 2.4.0

ff = webdriver.Firefox()
ff.get("http://somedomain/url_that_delays_loading")
try:
    element = WebDriverWait(ff, 10).until(lambda driver : driver.find_element_by_id("myDynamicElement"))
finally:
    ff.quit()
require 'rubygems' # not required for ruby 1.9 or if you installed without gem
require 'selenium-webdriver'

driver = Selenium::WebDriver.for :firefox
driver.get "http://somedomain/url_that_delays_loading"

wait = Selenium::WebDriver::Wait.new(:timeout => 10) # seconds
begin
  element = wait.until { driver.find_element(:id => "some-dynamic-element") }
ensure
  driver.quit
end

Данный код будет либо выдаст исключение “TimeoutException” по прошествии 10 секунд, либо вернет найденный в течении 10 секунд элемент. По умолчанию “WebDriverWait” вызывает “ExpectedCondition” каждые 500 миллисекунд до тех пор, пока условие не будет удовлетворено. Условие считается удовлетворенным, если было возвращено “true” в случае булевого “ExpectedCondition” и не “null” для “ExpectedCondition” других типов.

Также этот пример эквивалентен по функциональности с первым примером раздела Неявные ожидания.

Неявные ожидания

Неявное ожидание указывает WebDriver опрашивать DOM в течение конкретного периода времени при поиске элементов, в случае если они не появились сразу же. По умолчанию значение равно 0. Будучи однажды установлено, значение неявного ожидания останется действительным на протяжении всего существования экземпляра объекта “WebDriver”.

WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = driver.findElement(By.id("myDynamicElement"));
WebDriver driver = new FirefoxDriver();
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
driver.Url = "http://somedomain/url_that_delays_loading";
IWebElement myDynamicElement = driver.FindElement(By.Id("someDynamicElement"));
from selenium import webdriver

ff = webdriver.Firefox()
ff.implicitly_wait(10) # seconds
ff.get("http://somedomain/url_that_delays_loading")
myDynamicElement = ff.find_element_by_id("myDynamicElement")
require 'rubygems' # not required for ruby 1.9 or if you installed without gem
require 'selenium-webdriver'

driver = Selenium::WebDriver.for :firefox
driver.manage.timeouts.implicit_wait = 10 # seconds

driver.get "http://somedomain/url_that_delays_loading"
element = driver.find_element(:id => "some-dynamic-element")

RemoteWebDriver

Снятие скриншотов

import java.io.File;
import java.net.URL;

import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.Augmenter;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;

public class Testing {
    
    public void myTest() throws Exception {
        WebDriver driver = new RemoteWebDriver(
                                new URL("http://localhost:4444/wd/hub"), 
                                DesiredCapabilities.firefox());
        
        driver.get("http://www.google.com");
        
        // RemoteWebDriver does not implement the TakesScreenshot class
        // if the driver does have the Capabilities to take a screenshot
        // then Augmenter will add the TakesScreenshot methods to the instance
        WebDriver augmentedDriver = new Augmenter().augment(driver);
        File screenshot = ((TakesScreenshot)augmentedDriver).
                            getScreenshotAs(OutputType.FILE);
    }
}
// Add this class to your code and use this instead of RemoteWebDriver
// You will then be able to cast it to ITakesScreenshot and call GetScreenshot

public class ScreenShotRemoteWebDriver : RemoteWebDriver, ITakesScreenshot
{
       /// <summary>
       /// Gets a <see cref="Screenshot"/> object representing the image of the page on the screen.
       /// </summary>
       /// <returns>A <see cref="Screenshot"/> object containing the image.</returns>
       public Screenshot GetScreenshot()
       {
           // Get the screenshot as base64.
           Response screenshotResponse = this.Execute(DriverCommand.Screenshot, null);
           string base64 = screenshotResponse.Value.ToString();

           // ... and convert it.
           return new Screenshot(base64);
       }
}
from selenium import webdriver

driver = webdriver.Remote("http://localhost:4444/wd/hub", webdriver.DesiredCapabilities.FIREFOX)
driver.get("http://www.google.com")
driver.get_screenshot_as_file('/Screenshots/google.png')
require 'rubygems'
require 'selenium-webdrier'

begin
  driver = Selenium::WebDriver.for :remote, :url => "http://localhost:4444/wd/hub", :desired_capabilities => :firefox
  driver.get "http://www.google.com"
  driver.save_screenshot "/Screenshots/google.png"
ensure
  driver.quit
end

AdvancedUserInteractions

Browser Startup Manipulation

Использование прокси

Internet Explorer

Самый простой и рекомендуемый способ заключается в ручном изменении настроек прокси системы, где будут выпоняться тесты. Если это невозможно или если вы собираетесь запускать тесты в различных конфигурациях или с разными прокси, то вы можете использовать следующий способ с применением объекта “Capabilities”. Приведенный в следующем примере код временно изменяет системные настройки прокси. После окончания работы они будут возвращены к исходным значениям.

String PROXY = "localhost:8080";

org.openqa.selenium.Proxy proxy = new org.openqa.selenium.Proxy();
proxy.setHttpProxy(PROXY)
     .setFtpProxy(PROXY)
     .setSslProxy(PROXY);
DesiredCapabilities cap = new DesiredCapabailities();
cap.setPreference(CapabilityType.PROXY, proxy);

WebDriver driver = new InternetExplorerDriver(cap);
from selenium import webdriver

PROXY = "localhost:8080"

webdriver.DesiredCapabilities.INTERNETEXPLORER['proxy'] = {
    "httpProxy":PROXY,
    "ftpProxy":PROXY,
    "sslProxy":PROXY,
    "noProxy":None,
    "proxyType":"MANUAL",
    "class":"org.openqa.selenium.Proxy",
    "autodetect":False
}

# you have to use remote, otherwise you'll have to code it yourself in python to 
# dynamically changing the system proxy preferences
driver = webdriver.Remote("http://localhost:4444/wd/hub", webdriver.DesiredCapabilities.INTERNETEXPLORER)
require 'rubygems' 
require 'selenium-webdriver'

PROXY = "localhost:8080"

caps = Selenium::WebDriver::Remote::Capabilities.ie(:proxy => Selenium::WebDriver::Proxy.new(
  :http => PROXY,
  :ftp=>PROXY,
  :ssl=>PROXY,
  :no_proxy=>nil
))
# you have to use remote, otherwise you'll have to code it yourself in ruby to 
# dynamically changing the system proxy preferences
driver = Selenium::WebDriver.for :remote,  :url => "http://localhost:4444/wd/hub", :desired_capabilities => caps

Chrome

В основном все так же, как и в случае с Internet Explorer. Chrome использует те же настройки, что и IE, в операционной системе Windows. На Mac используются значения из System Preference -> Network settings. В Linux (Ubuntu): System > Preferences > Network Proxy Preferences (как вариант, можно задать http_proxy в “/etc/environment”). На момент написания нет сведений о том, как изменить настройки программным путем.

Firefox

Firefox содержит настройки прокси в профиле. Вы можете использовать создаваемый профиль с предустановленными необходимыми значениями или поменять их в уже существующем профиле “на лету”, как в следующем примере:

String PROXY = "localhost:8080";

org.openqa.selenium.Proxy proxy = new org.openqa.selenium.Proxy();
proxy.setHttpProxy(PROXY)
     .setFtpProxy(PROXY)
     .setSslProxy(PROXY);
DesiredCapabilities cap = new DesiredCapabailities();
cap.setPreference(CapabilityType.PROXY, proxy);
WebDriver driver = new FirefoxDriver(cap);
from selenium import webdriver

PROXY_HOST = "host"
PROXY_PORT = 8080

fp = webdriver.FirefoxProfile()

# Direct = 0, Manual = 1, PAC = 2, AUTODETECT = 4, SYSTEM = 5
fp.set_preference("network.proxy.type", 1)

fp.set_preference("network.proxy.http", PROXY_HOST)
fp.set_preference("network.proxy.http_port", PROXY_PORT)
fp.set_preference("network.proxy.ftp", PROXY_HOST)
fp.set_preference("network.proxy.ftp_port", PROXY_PORT)
fp.set_preference("network.proxy.ssl", PROXY_HOST)
fp.set_preference("network.proxy.ssl_port", PROXY_PORT)

fp.set_preference("network.proxy.no_proxies_on", "") # set this value as desired

driver = webdriver.Firefox(firefox_profile=fp)
require 'rubygems'
require 'selenium-webdriver'

PROXY = 'localhost:8087'

profile = Selenium::WebDriver::Firefox::Profile.new
profile.proxy = Selenium::WebDriver::Proxy.new(
  :http => PROXY,
  :ftp => PROXY,
  :ssl => PROXY,
  :no_proxy => nil
)

driver = Selenium::WebDriver.for :firefox, :profile => profile

Opera

Todo

HTML5

Распараллеливание выполнения тестов

Дополнительная информация