0

我试图让 Selenium,特别是 WebDriver v2.31,与谷歌地图交互。我可以点击 [first] Get Directions 按钮输入一对地址,然后单击两个地址下的 Get Directions 按钮。这导致了一组行驶方向。我不能做的是让 Selenium 滚动到“方向”面板的底部,这样我就可以看到目的地和“保存到我的地图”链接。不知道是不是因为滚动条是浏览器产生的问题。

我可以在 Yahoo! 上进行搜索 并滚动到结果网页的底部;我认为这是因为网页架构中没有其他框架或面板。尽管如此,浏览器生成的是滚动条,而不是网页。

我可以用鼠标按住并向下拖动滚动条来构建一个动作。我不喜欢这种解决方案,因为如果页面大小不同或面板大小不同,执行此操作会导致大量重新计算。我更喜欢类似于 Yahoo! 中的单个“文档”窗口的解决方案。或谷歌代码。

任何帮助将不胜感激。在过去的三天里,我一直在互联网上绞尽脑汁寻找解决方案。

谢谢。

史蒂夫

附录:如下所述。我不是想对地图本身做任何事情,而是对包含方向的面板做任何事情。我正在使用 Google 地图,因为它类似于我稍后必须测试的应用程序。我需要能够让 [Selenium] WebDriver 滚动到面板底部,这样我就可以选择“下一步”链接——就像滚动到 Google 地图中的“方向”面板底部并在底部看到“保存”链接一样。

我不确定在使用术语面板时是否使用了正确的术语。问题在于,当显示网页时,面板会动态生成滚动条。

driver.switchTo().frame(driver.findElement(By.id("spsizer")));
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("javascript:window.scrollBy(250,750)", element);
driver.switchTo().defaultContent();

不幸的是,“面板”不包含在框架中或者是框架......由 Selenium 返回的异常标识:

 Exception in thread "main" org.openqa.selenium.NoSuchFrameException: Element is not a frame element: DIV

我相信我已经确定该面板具有使用 FireBug 的 ID(“spsizer”)。

这也不起作用:

element = driver.findElement(By.id("spsizer"));
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("javascript:window.scrollBy(250,750)", element);

这只是在不滚动到“方向”面板底部的情况下执行,但它也不会引发异常。

4

2 回答 2

1

我可以使用下面屏幕截图中给出的以下代码保存我的地图链接。

无需记录向下滚动面板的步骤,Selenium 可以在网页中的任何 Web 对象上定位和执行操作,而用户不可见。

在此处输入图像描述

代码详情:

第 6 行:Command -waitForVisible Target - //div[@id='dir_sr']/a[@id='srlink']

我添加了waitForVisible,这样 Selenium 将等待 5 秒,然后链接保存到我的地图可见。这将为按下“获取路线”按钮后加载页面提供足够的同步时间。//div[@id='dir_sr']/a[@id='srlink']是链接保存到我的地图的 XPath 定位器

第7行:Command-点击 目标- //div[@id='dir_sr']/a[@id='srlink']

点击链接保存到我的地图

第8行:Command-单击 目标- //按钮[@id='srsave' ]

点击按钮保存

C#.Net WebDriver 代码相同。请注意,必须提供 Google 帐户用户名和密码才能保存地图链接。

using System;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.Support.UI;

namespace SeleniumTests
{
    public class GoogleMapSavingTest
    {
          static void Main(string[] args)
          {
              IWebDriver driver = new FirefoxDriver();
              driver.Navigate().GoToUrl("https://maps.google.com.au/");
              driver.FindElement(By.Id("d_launch")).Click();
              driver.FindElement(By.Id("d_d")).Clear();
              driver.FindElement(By.Id("d_d")).SendKeys("Franklin, ACT");
              driver.FindElement(By.Id("d_daddr")).Clear();
              driver.FindElement(By.Id("d_daddr")).SendKeys("Gungahlin, ACT");
              driver.FindElement(By.Id("d_d")).Click();
              driver.FindElement(By.Id("d_sub")).Click();
              for (int second = 0;; second++) 
              {
                    if (second >= 60) Assert.Fail("timeout");
                     try
                     {
                        if  (driver.FindElement(By.XPath("//div[@id='dir_sr']/a[@id='srlink']")).Displayed) break;
                    }
                    catch (Exception)
                    {}
                    Thread.Sleep(1000);
                }
             driver.FindElement(By.XPath("//div[@id='dir_sr']/a[@id='srlink']")).Click();
                driver.FindElement(By.Id("Email")).SendKeys("UserName");
                driver.FindElement(By.Id("Passwd")).SendKeys("Password");
                driver.FindElement(By.Id("signIn")).Click();
                for (int second = 0; ; second++)
                {
                    if (second >= 60) Assert.Fail("timeout");
                    try
                    {
                        if (driver.FindElement(By.XPath("//div[@id='dir_sr']/a[@id='srlink']")).Displayed) break;
                    }
                    catch (Exception)
                    { }
                    Thread.Sleep(1000);
                }
             driver.FindElement(By.XPath("//div[@id='dir_sr']/a[@id='srlink']")).Click();
            driver.FindElement(By.XPath("//button[@id='srsave']")).Click();


          }





}

}

于 2013-03-21T12:37:25.697 回答
0

我知道有人在 GitHub 上创建了一个 Selenium 扩展,旨在自动化地图应用程序,但我不记得如何找到它。几周前我在浏览 GitHub 时看到了它,它通过 javascript 使用图像识别(我不是指 Sikuli)。我认为,如果您足够努力地寻找它,那么您正在寻找的东西就会存在。

如果您使用的是远程网格,我会避免使用 Sikuli,否则它可能对您有用。此外,当涉及 iframe 时,最好在放弃自动化框架之前始终尝试 JavaScriptExecutor(带有 switchTo 框架)。

在那之前,您可以从查看WebDriverJS开始。此外,即使只是为了获得灵感, GhostDriver也可能值得一看。

于 2013-03-20T20:35:19.507 回答