### 彈窗與frame的定位與控制
* * * * *
> 對于web應用,經常會出現框架(frame) 或窗口(window)的應用,這也就給我們的定位帶來了一個難題。有時候我們定位一個元素,定位器沒有問題,但一直定位不了,這時候就要檢查這個元素是否在一個frame中,seelnium webdriver 提供了這樣的方法,可以很輕松的來解決這個問題。
>* $driver->switchTo()->frame("id")
>* $driver->switchTo()->window("id")
>* $driver->switchTo()->alert()
[TOC]
#### frame示例腳本
~~~
<?php
namespace Facebook\WebDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
require_once('vendor/autoload.php');
header("Content-Type: text/html; charset=UTF-8");
// start Firefox with 5 second timeout
$host = 'http://localhost:4444/wd/hub'; // this is the default
$capabilities = DesiredCapabilities::chrome();
$driver = RemoteWebDriver::create($host, $capabilities, 5000);
$driver->manage()->timeouts()->implicitlyWait(15); //隱性設置15秒
$driver->get('https://v.qq.com/x/cover/e7hi6lep1yc51ca.html?vid=h0018p9ihom');
echo $driver->getCurrentURL().'\r\n';
//將頁面滾動條拖到底部
//因為這個頁面默認打開的時候,"評論區"的iframe沒有渲染到DOM里,騰訊做的處理是拖動到底部的時候用JS動態渲染,所以我們需要控制瀏覽器滾動至底部
$js = "window.scrollBy(0,100000000);";
$driver->executeScript($js);
sleep(3);
#再找到其下面的 iframe(id=commentIframe)
$driver->switchTo()->frame("commentIframe");
$str = $driver->getPageSource();
//將獲取到的影評數據保存再本地,再測試是否正確。
$myfile = fopen("d://newfile.html", "w") or die("Unable to open file!");
fwrite($myfile, $str);
fclose($myfile);
echo 'done!';
//關閉瀏覽器
$driver->quit();
?>
~~~
#### alert示例腳本
~~~
<?php
//~~~以上代碼省略...
$driver->switchTo()->alert()->accept(); //獲取到confim alert,并且點擊同意
$driver->switchTo()->alert()->dismiss(); //取消
$driver->switchTo()->alert()->getText(); //獲取alert彈出的提示內容
?>
~~~
> 我們以百度的頁面為例來演示一下功能。
> 1.點擊百度的設置
> 2.選擇"每天顯示多少條"的下拉框 (這個順便把“元素操作”文章中的“select”元素章節也演示了)
> 3.點擊保存設置按鈕:會彈出一個alert彈窗
> 4.執行點擊alert的確定按鈕
> 5.試一下搜索的結果是否變化,操作完畢
~~~
<?php
namespace Facebook\WebDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
require_once('vendor/autoload.php');
header("Content-Type: text/html; charset=UTF-8");
// start Firefox with 5 second timeout
$host = 'http://localhost:4444/wd/hub'; // this is the default
$waitSeconds = 15; //需等待加載的時間,一般加載時間在0-15秒,如果超過15秒,報錯。
$capabilities = DesiredCapabilities::chrome();
$driver = RemoteWebDriver::create($host, $capabilities, 5000);
$driver->get('https://www.baidu.com/');
$driver->findElement(WebDriverBy::linkText('設置'))->click();
$driver->findElement(WebDriverBy::linkText('搜索設置'))->click();
$warpper = $driver->findElement(WebDriverBy::id('wrapper'));
//由于下拉框是通過點擊“搜索設置”按鈕觸發JS動態生成的DOM,所以這里使用Wait for new element to appear方式,不然直接調用查找元素會報錯,說找不到元素
$driver->wait($waitSeconds)->until(
WebDriverExpectedCondition::visibilityOfElementLocated(
WebDriverBy::id('nr')
)
);
$selectDom = $warpper->findElement(WebDriverBy::id('nr'));
$select = new WebDriverSelect($selectDom);
$select->selectByValue(10);
//由于下拉框是通過點擊“搜索設置”按鈕觸發JS動態生成的DOM,所以這里使用Wait for new element to appear方式,不然直接調用查找元素會報錯,說找不到元素
$driver->wait($waitSeconds)->until(
WebDriverExpectedCondition::visibilityOfElementLocated(
WebDriverBy::linkText('保存設置')
)
);
$driver->findElement(WebDriverBy::linkText('保存設置'))->click();
sleep(2);
$driver->switchTo()->alert()->accept();
$driver->findElement(WebDriverBy::id("kw"))->sendKeys('wwe');
$driver->findElement(WebDriverBy::id("su"))->click();
echo 'done!';
//關閉瀏覽器
//$driver->quit();
?>
~~~
#### window彈窗 示例腳本
~~~
//$driver->switchTo()->window("id"),用法與 frame 相同。
~~~