### 弹窗与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 相同。
~~~