多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
### 弹窗与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 相同。 ~~~