Javascript 如何修复selenium web驱动程序运行过快的问题?
没有什么是好的。建议我更好的选择。由于速度快,我无法以更好的方式检测执行情况。 这是我的密码:Javascript 如何修复selenium web驱动程序运行过快的问题?,javascript,selenium,selenium-webdriver,Javascript,Selenium,Selenium Webdriver,没有什么是好的。建议我更好的选择。由于速度快,我无法以更好的方式检测执行情况。 这是我的密码: public static void main(String[] args) { //**********************************open ff WebDriver driver=new FirefoxDriver(); //**************************************maximize ff d
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();
}
}
publicstaticvoidmain(字符串[]args){
//**********************************开放式ff
WebDriver=newfirefoxdriver();
//**************************************最大化ff
driver.manage().window().maximize();
Logger log=Logger.getLogger(“devpinoyLogger”);
驱动程序。获取(“http://navvitistgvm.cloudapp.net/nvrppluginassist/Account/Login");
调试(“输入用户名”);
driver.findElement(By.xpath(“/*[@id='UserName'])).sendKeys(“rpadmin”);
log.debug(“输入密码”);
findElement(By.xpath(“/*[@id='Password'])).sendKeys(“Password123”);
调试(“单击登录”);
findElement(By.xpath(“//*[@id='loginForm']/form/div[4]/div/input”))。单击();
log.debug(“点击凭证”);
findelelement(By.xpath(“html/body/nav/div[2]/div[2]/ul/li[2]/a”)。单击();
log.debug(“选择搜索凭证”);
列表元素=driver.findElements(By.id(“VoucherType”);
//元素。获取(0)。单击();//GV
元素。获取(1)。单击();//GC
//元素。获取(2)。单击();//AP
driver.manage().timeouts().setScriptTimeout(30,TimeUnit.SECONDS);
findElement(By.xpath(“//*[@id='main']/form[2]/div[2]/input[4]”);
driver.manage().timeouts().setScriptTimeout(30,TimeUnit.SECONDS);
findelelement(By.xpath(“//*[@id='main']/div[1]/span/a”)。单击();
}
}
没有什么是好的。建议我更好的选择。由于速度太快,我无法以更好的方式检测执行情况。如果在执行某个操作之后,在执行另一个操作之前,没有出现此类元素异常,请使用显式等待()
请不要添加一堆睡眠 所以这不是对你的问题的直接回答,这会减慢过程,但这是对我认为你的问题的回答 您不需要这些步骤来运行得更慢,但您需要的是确保在页面正确加载之前不运行任何步骤 您可以使用
WebDriverWait
和elementlocated的可见性
来解决此问题
我在代码中添加了几行
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();
}
}
尝试一下第一种方法,这是一个更好的解决方案。您需要使用fluent等待页面加载,或者在每次单击事件后等待特定元素加载,然后执行某些selenium api调用: 你可以在这里找到关于selenium如何流畅等待的文档 如果隐式和显式不能按预期工作,您可以尝试Thread.sleep(3000)(3秒) 我希望下面的链接澄清执行速度,
对于2020年寻求帮助的您,我建议您使用以下页面:
我使用了显式等待方法!很有帮助你是说你的程序太快了,并问你怎么能让它慢下来?你能给你的问题补充一点细节吗,这样我可以更好地回答你。你到底有什么问题?是的。正因为如此,有时它不会给出这样的元素“发现异常”。@cOnly slenium web驱动程序会快速单击或输入每个细节。我需要降低整个过程的速度。您希望每个命令之间都有更多的时间运行吗?您说您没有得到这样的元素异常,这表明测试运行得有点太早,而不是太快。哪些元素会出现这种异常?我已经尝试了你给出的链接。但它仍然不起作用。你能根据我的代码给我一些建议吗???似乎点击后有一些变化,所以你需要等待点击事件后状态的一些变化。例如,如果在单击“登录”之后,凭证按钮/链接甚至不在DOM中,则必须等待该按钮/链接出现。是的,我只想减慢代码的执行速度。你能帮我吗?更新答案,以给出一个示例,说明如何做你想做的事,我仍然建议使用第一个解决方案,它会更好,并且会阻止您获得这些异常
public void waitAndClick(Xpath) {
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.findElement(By.xpath(Xpath)).click();
}