我正在使用Selenium Java 2.0b3.我有这个代码:
...
WebDriver driver = new InternetExplorerDriver();
Selenium seleniumDriver = new WebDriverBackedSelenium(driver, "http://localhost:8088/Sistema/");
...
...
RenderedWebElement menuRegistrar = (RenderedWebElement)driver.findElement(By.xpath("//a[normalize-space()='Registrar']"));
seleniumDriver.mouseOver("//a[normalize-space()='Registrar']"); //makes element visible
menuRegistrar.click();
seleniumDriver.mouseOut("//a[normalize-space()='Registrar']");
...
Run Code Online (Sandbox Code Playgroud)
与InternetExplorerDriver(使用IE 8)的魅力相似,但它不适用于FirefoxDriver(使用Firefox 4).我用代码尝试了很多东西,没有任何作用.我必须使用FirefoxDriver,因为我正在测试的应用程序与IE的表现不佳.
正如您可能猜到的那样,"注册器"链接将被隐藏,直到mouseOver事件触发.
任何经证实的解决方法?谢谢你的时间...
编辑:还试用ChromeDriver与Chrome 11.也没用.如果有适用于Chrome的解决方法,我会接受它!
答案(Selenium Java 2.0RC1,Windows 7,Firefox 4的工作代码):感谢Andy Tinkham和Luke Inman-Semerau:
//get the element that shows menu with the mouseOver event
WebElement menu = driver.findElement(By.xpath("//div[@id='nav']/li[3]"));
//the element that I want to click (hidden)
WebElement menuOption = driver.findElement(By.xpath("//a[normalize-space()='Registrar']"));
//build and …Run Code Online (Sandbox Code Playgroud) 好吧也许每个人都知道如何做到这一点,但我从来没有尝试过,因为我从来没有需要它,你如何使用eclipse中的多个引用项目?我有几个Struts 1 Web应用程序,必须使用另一个struts 1"库"项目,现在我正在使用url请求进行它们之间的通信,这真的很烦人(至少我是如何实现它的).
我希望能够直接在我的其他struts应用程序中使用"库"项目的类.
到目前为止,我知道应该在同一个工作区中,我必须使用项目属性中的"项目引用"选项进行引用,但就是这样!我真的不知道接下来该做什么.
谢谢!
好的,做到了!现在,当我在WAR文件中导出struts应用程序时,struts库应用程序会发生什么?我是否需要在单独的WAR文件中导出或仅导出主要应用程序WAR还将导出库Web应用程序的所有文件?
我们有一个在生产环境中运行的Web应用程序,在某些时候客户抱怨应用程序有多慢.
当我们检查应用程序和数据库发生了什么时,我们发现了几个用户同时执行的这个"宝贵"查询(从而在数据库服务器上造成了极高的负载):
SELECT NULL AS table_cat,
o.owner AS table_schem,
o.object_name AS table_name,
o.object_type AS table_type,
NULL AS remarks
FROM all_objects o
WHERE o.owner LIKE :1 ESCAPE :"SYS_B_0" AND
o.object_name LIKE :2 ESCAPE :"SYS_B_1" AND
o.object_type IN(:"SYS_B_2", :"SYS_B_3")
ORDER BY table_type, table_schem, table_name
Run Code Online (Sandbox Code Playgroud)
我们的应用程序不执行此查询,我相信它是一个Hibernate内部查询.我发现很少有关于为什么Hibernate会执行这个极其繁重的查询的信息,所以任何有关如何避免它的帮助都非常感谢!
生产环境信息:Red Hat Enterprise Linux 5.3(Tikanga),JDK 1.5,Web容器OC4J(whitin Oracle Application Server),Oracle Database 10.1.0.4,JDK 1.2和1.3的JDBC驱动程序,Hibernate版本3.2.6.ga,连接池库C3P0版本0.9.1.
更新:感谢@BalusC for claryfing确实是Hibernate执行查询,现在我对正在发生的事情有了更好的了解.我将解释我们处理hibernate会话的方式(这是非常基本的,如果你有关于如何更好地处理它的建议,我们非常欢迎!)
我们有一个过滤器(实现javax.servlet.Filter),当它启动时(init方法)它构造会话工厂(通常这只发生一次).然后,进入应用程序的每个HttpRequest都会通过过滤器并获得一个新会话并启动一个事务.当它结束的过程时,它通过过滤器返回,进行事务的提交,杀死 hibernate会话,然后继续前进页面(我们不在Http会话中存储hibernate会话,因为它在我们的测试).
现在这里是我认为问题所在的部分.在我们的开发环境中,我们在Tomcat 5.5中部署我们的应用程序,当我们启动服务时,所有过滤器都会立即启动,只启动一次.在使用OC4J的生产环境中似乎没有这样的方式.我们部署应用程序,并且只有在第一个请求到达时,OC4J才会实例化过滤器.
这让我认为OC4J在每个请求上实例化过滤器(或者至少多次,这仍然是错误的),从而在每个请求上创建会话工厂,执行%&%#%$#查询,这导致我的问题!
现在,这是正确的吗?有没有办法让我配置OC4J才能实例化一次过滤器?
非常感谢大家花时间回复此事!
首先,一些背景:我是ASP.NET MVC 2和NHibernate的新手.我正在开始我的第一个应用程序,我想使用NHibernate,因为我来自JSP + Struts 1 + Hibernate Web应用程序.
似乎没有人在谈论这个,所以我想这一定是非常明显的.我仍然挠头,因为我找不到能够完成以下事情的解决方案:
1)我想使用"每个请求的会话"策略.因此,每次用户发出请求时,他都会获得Nhibernate会话,启动事务,当请求结束时,事务提交,NHibernate会话关闭(如果存在则返回池).这保证了我的交易是原子的.
2)当发生数据库异常(PK违规,唯一违规,无论如何)时,我想捕获该异常,回滚我的事务并给用户一个明确的消息:如果是PK违规,那么该消息,以及所有完整性相同错误.
那么,我的问题是什么?我来自Java World,我使用Filter打开会话,启动事务,处理请求,然后提交事务并关闭会话.这有效,除非发生数据库异常,并且当您进入过滤器时,无法更改目标页面,因为响应已提交.
因此,当实际交易被回滚时,用户会看到成功页面.为了避免这种情况,我必须在Java中编写大量数据完整性检查,以防止所有完整性异常,因为我无法正确处理它们.这很糟糕,因为我正在做的工作而不是把它留给数据库(或者我错了,我总是要在我的应用程序中编写所有这些数据完整性代码?).
所以我发现我猜的IHttpModule接口与javax.servlet.Filter的概念基本相同(如果我错了,请纠正我),所以我猜我可能会再遇到同样的问题.
我应该在哪里提交我的提交以确保我的事务是原子的,当它们抛出异常时我可以捕获它们并更改我的目标页面并给用户一个全面的消息?
到目前为止,我提出的唯一可能的解决方案是保持我的IHttpModule启动和关闭事务,并将提交调用放在我的控制器方法的最后一行,从而能够捕获那里的异常,然后返回适当的查看消息.现在我必须将这些提交和异常处理行复制到我需要提交的所有控制器方法中.并且存在关注点分离问题,我的控制器必须知道DB,我完全不喜欢它.
有没有更好的办法?
我注意到struts 2框架的javascript客户端验证功能使用了struts2 JAR文件中的javascript文件.javascript文件显然只是通过使用框架中的标记以某种方式包含在JSP页面中.
如果我设法做到这一点,对于我在每个新的Web项目中总是复制的许多javascript库文件将非常有帮助,因为我将它们全部放在JAR文件中,然后每个项目都没有不同文件的副本(如你所知,这会造成很多麻烦).
谁知道他们是怎么做到的?
我在使用实体框架尝试使用重复参数执行SQL查询时遇到了麻烦.
查询是关键字搜索,它在不同的表中查找,因此多次使用相同的参数.我正在使用LIKE语句(是的,我知道我应该使用FULLTEXTSEARCH,但我现在没有时间).
我已经尝试了这里解释的所有语法:如何在存储过程中使用DbContext.Database.SqlQuery <TElement>(sql,params)?EF Code First CTP5 并且它们都不会使查询工作(我得到零返回行).
我甚至尝试在运行时构建一个字符串数组,其长度等于参数在查询中重复的次数,然后使用关键字搜索项填充数组的所有元素.然后我将其作为对象[]参数传递给我.也没用.
唯一有效的方法是进行搜索和替换,这显然是一个坏主意,因为参数来自文本输入,我将容易受到SQL注入攻击.
工作代码(易受SQL注入攻击,但查询返回行):
//not the real query, but just for you to have an idea
string query =
"SELECT Field1, " +
" Field2 " +
"FROM Table1 " +
"WHERE UPPER(Field1) LIKE '%{0}%' " +
"OR UPPER(Field2) LIKE '%{0}%'";
//keywordSearchTerms is NOT sanitized
query = query.Replace("{0}", keywordSearchTerms.ToUpper());
List<ProjectViewModel> list = null;
using (var context = new MyContext())
{
list = context.Database.SqlQuery<ProjectViewModel>(query, new object[] { }).ToList();
}
return …Run Code Online (Sandbox Code Playgroud)