如何修复selenium web驱动程序移动太快?

时间:2015-11-20 20:12:31

标签: javascript selenium selenium-webdriver

没有什么比这更好的了。建议我更好的选择。由于速度快,我无法以更好的方式检测执行。 这是我的代码:

public static void main(String[] args) {

    //**********************************open ff
        WebDriver driver=new FirefoxDriver();
    //**************************************maximize ff 
        driver.manage().window().maximize();

            Logger log = Logger.getLogger("devpinoyLogger");
        driver.get("http://navvitistgvm.cloudapp.net/nvrppluginassist/Account/Login");

            log.debug("entring username");      
        driver.findElement(By.xpath("//*[@id='UserName']")).sendKeys("rpadmin");

            log.debug("entering password");
        driver.findElement(By.xpath("//*[@id='Password']")).sendKeys("Password123");

            log.debug("Clicking login");
        driver.findElement(By.xpath("//*[@id='loginForm']/form/div[4]/div/input")).click();

            log.debug("Clicking voucher");
        driver.findElement(By.xpath("html/body/nav/div[2]/div[2]/ul/li[2]/a")).click();



                log.debug("selecting search_voucher");

                 List<WebElement> elements=driver.findElements(By.id("VoucherType"));
                 //elements.get(0).click(); //GV
                 elements.get(1).click();  //GC
                 //elements.get(2).click();//AP

                 driver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS);

            driver.findElement(By.xpath("//*[@id='main']/form[2]/div[2]/input[4]")).click();
            driver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS);
                driver.findElement(By.xpath("//*[@id='main']/div[1]/span/a")).click();
    }
    }

没有什么比这更好的了。建议我更好的选择。由于速度快,我无法以更好的方式检测执行情况。

5 个答案:

答案 0 :(得分:1)

对于您在2020年寻求帮助的您,我推荐此页面: https://www.selenium.dev/documentation/en/webdriver/waits/

我使用了显式等待方法!帮助抢劫

答案 1 :(得分:0)

如果在执行某些操作之后没有获得此类元素异常,则在使用其他操作之前,请使用显式等待(http://www.seleniumhq.org/docs/04_webdriver_advanced.jsp)。

请不要添加一堆睡眠!!

答案 2 :(得分:0)

因此,这不是对您的问题的直接回答,从而减慢了流程,但这是我认为您所遇到的问题的答案。

您不需要执行较慢的步骤,但您需要确保在页面正确加载之前不要运行任何步骤。

您可以使用WebDriverWaitvisibilityOfElementLocated来解决此问题。

我在您的代码中添加了几行

import static org.openqa.selenium.support.ui.ExpectedConditions.visibilityOfElementLocated;
import org.openqa.selenium.support.ui.WebDriverWait;


public static void main(String[] args) {

  //**********************************open ff
  WebDriver driver = new FirefoxDriver();
  WebDriverWait wait = new WebDriverWait(driver, 30);
  //**************************************maximize ff 

  driver.manage().window().maximize();

  Logger log = Logger.getLogger("devpinoyLogger");
  driver.get("http://navvitistgvm.cloudapp.net/nvrppluginassist/Account/Login");
  // driver.get should block the execution of following steps untill the
  // page has loaded so this line below in theory shouldnt be needed.
  // Try it in your code and see for yourself
  // Wait till the username field is visible.
  wait.until(visibilityOfElementLocated(By.xpath("//*[@id='UserName']"))));

  log.debug("entring username");      
  driver.findElement(By.xpath("//*[@id='UserName']")).sendKeys("rpadmin");

  log.debug("entering password");
  driver.findElement(By.xpath("//*[@id='Password']")).sendKeys("Password123");

  log.debug("Clicking login");
  driver.findElement(By.xpath("//*[@id='loginForm']/form/div[4]/div/input")).click();

  // I assume here is your other issue, when clixking login the view changes
  // and your running this next command before the view has properly refreshed.
  // add a wait here as well.
  wait.until(visibilityOfElementLocated(By.xpath("html/body/nav/div[2]/div[2]/ul/li[2]/a")));

  log.debug("Clicking voucher");
  driver.findElement(By.xpath("html/body/nav/div[2]/div[2]/ul/li[2]/a")).click();

  log.debug("selecting search_voucher");

   List<WebElement> elements=driver.findElements(By.id("VoucherType"));
   //elements.get(0).click(); //GV
   elements.get(1).click();  //GC
   //elements.get(2).click();//AP

   driver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS);

  driver.findElement(By.xpath("//*[@id='main']/form[2]/div[2]/input[4]")).click();
  driver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS);
      driver.findElement(By.xpath("//*[@id='main']/div[1]/span/a")).click();
}
}

如果你真的希望代码执行&#34;更慢&#34;我不推荐的东西(你制作它的速度有多慢?)更好的方法是使用我上面展示的方法明确测试,只在你知道需要的地方添加等待(例如页面/视图加载为行动的结果)

一种方法是包装动作并添加超时,例如:

public void waitAndClick(Xpath) {
  driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
  driver.findElement(By.xpath(Xpath)).click();
}

尝试第一种方法,这是一个更好的解决方案。

答案 3 :(得分:0)

您需要使用流畅的等待页面加载或在每次单击事件之后等待加载特定元素然后执行某些selenium api调用:

你可以在这里找到关于硒等待硒的工作原理的文档 https://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/support/ui/FluentWait.html

答案 4 :(得分:0)

如果implicity和明显不能按预期工作,你可以尝试Thread.sleep(3000)(3秒)。

我希望以下链接澄清执行速度, setSpeed in Selenium WebDriver using Ruby