9

有时网页的可见内容取决于页面输入元素的状态(例如,输入元素“选择你的大学”可能仅在您在“工作”字段中选择“学生”后出现)或单击某些页面元素(如下拉菜单纽扣)。我正在尝试使用 Selenium Webdriver 自动查找此类页面元素依赖项的过程。第一个想法是在文本输入字段中输入一些东西,设置选中/未选中的复选框,单击一些按钮/链接等,看看页面上是否有任何元素出现/消失。问题是:

  • 有没有一种简单的方法可以确定页面上是否出现了某些内容?好吧,我可以在每次更改后制作从网页元素到 {'visible', 'invisible'} 状态的映射,并找出是否有某些变化,但是为此目的是否有内置的东西?

  • 单击某些按钮可能会导致加载另一个页面,并且我想留在我正在测试的页面中,有没有办法确定 click() 方法是否会导致加载另一个页面并阻止它?

4

3 回答 3

7

Divi对问题2的回答很好。对于第 1 部分,您可以检查元素是否像您所说的那样显示:

 webElement.isDisplayed();

或者您可以比较事件前后页面的 html。

driver.getPageSource();

(如果在每个事件之后发生更改,您也可以检查 url)。

获取 html 源的一个问题是事件可能在您最后一次操作之后触发并且尚未完成,从而使 html 保持不变。要解决此问题,您可以检查以下一些条件:

(Boolean) ((JavascriptExecutor)driver).executeScript("return jQuery.ready"); 
((JavascriptExecutor)driver).executeScript("return document.readyState").equals("complete");

或者您可能正在使用另一个 javascript 框架,该框架具有类似于 jQuery.ready 的另一个功能。

最后,您可能会遇到事件仅在您更改活动元素、跳出字段等后才会触发的问题。因此您可以运行以下内容:

Actions actionObject = new Actions(driver); 
actionObject.sendKeys(Key.TAB).perform();

或者你可以使用 javascript 来设置它(我没有检查下面的代码,我会将 webElement 设置为 html 基本元素):

((JavascriptExecutor) driver).executeScript("arguments[0].focus();", webElement);

我不建议使用 webdriver 来单击 body 元素,因为这可能会撤消您的最后一次单击。

为了完整起见,我将 Divi 对问题 2 的回答包括在内:

我们可以通过获取页​​面的 url 并将其与预期的 url 进行比较来检查它是否重定向到另一个页面

WebDriver driver;

driver.getCurrentUrl() // will returns the String value

如果您当前的网址与您的预期网址不匹配,则意味着您有两种方法

1)您可以使用硒(或)网络驱动程序导航方法中的打开功能再次打开您的预期网址

driver.navigate().to("expected_url");

2)您可以使用后退导航

driver.navigate().back();
于 2012-08-30T00:10:55.293 回答
3

根据 James 的回答,并且由于我们的测试站点不使用 jQuery,以下内容对我有用:

public static class WebDriverExtensions
{
    public static void WaitForPage(this IWebDriver driver)
    {
        WaitForPage(driver, 60, 200);
    }

    private static void WaitForPage(IWebDriver driver, int seconds, int waitFor)
    {
        while (!((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"))
        {
            System.Threading.Thread.Sleep(50);
        }
        bool stillChanging = true;
        int iterations = 0;
        int maxIterations = (1000 * seconds) / waitFor;
        string previous = "";
        string current = "";
        while (stillChanging && iterations < maxIterations)
        {
            current = driver.PageSource;
            System.Threading.Thread.Sleep(waitFor);
            stillChanging = (!previous.Equals(current));
            previous = current;
        }
    }

    public static void Click(this IWebElement el, IWebDriver driver)
    {
        el.Click();
        driver.WaitForPage();
    }
 }

我在代码中所做的是调用 el.Click(driver) 而不是 el.Click()。该方法将在页面停止更改后返回。您还可以在更改可能会更改页面上的某些内容之前/之后调用公共 driver.WaitForPage() 方法。应该修改硬编码值,以确保您的最大超时和检查更改之间的时间按预期工作。使 waitFor 太小,您将无法检测到更改。让它太大,每次点击后你必须等待很长时间。

于 2013-06-05T08:24:20.780 回答
1

好吧,您的第一个问题是检查 Java 中的可见性

Selenium selenium;

selenium.isVisible("id=element_id"); // it will return boolean value whether the element is present or not 

如果你想使用 webDriver 意味着然后使用

RenderedWebElement webElement=findElement(By.id("element_id"));
webElement.isDisplayed();

对于你的第二个问题

我们可以通过获取页​​面的 url 并将其与预期的 url 进行比较来检查它是否重定向到另一个页面

WebDriver driver;

driver.getCurrentUrl() // will returns the String value

如果您当前的网址与您的预期网址不匹配,则意味着您有两种方法

1)您可以使用硒(或)网络驱动程序导航方法中的打开功能再次打开您的预期网址

driver.navigate().to("expected_url");

2)您可以使用后退导航

driver.navigate().back();
于 2012-08-27T09:49:57.707 回答