Extjs 如何单击弹出窗口上的复选框,该窗口不显示';我没有名字、标签

Extjs 如何单击弹出窗口上的复选框,该窗口不显示';我没有名字、标签,extjs,selenium,checkbox,webdriver,Extjs,Selenium,Checkbox,Webdriver,我是SeleniumWebDriver的新手。我正在开发一个应用程序,在这个应用程序中,单击一个按钮将弹出一个创建新文件夹的窗口。在这个弹出窗口中,我们需要填写几个输入字段,选中几个复选框,然后单击“创建”按钮来创建文件夹。我试图点击复选框,然后点击创建。复选框没有名称、文本和标签。我尝试使用CSS选择器和元素的以下xpath,但是这些都不起作用。当使用xpath运行时,我得到一个异常错误,说“无法定位元素” driver.findElement(By.xpath(“/div[9]/div[2]

我是SeleniumWebDriver的新手。我正在开发一个应用程序,在这个应用程序中,单击一个按钮将弹出一个创建新文件夹的窗口。在这个弹出窗口中,我们需要填写几个输入字段,选中几个复选框,然后单击“创建”按钮来创建文件夹。我试图点击复选框,然后点击创建。复选框没有名称、文本和标签。我尝试使用CSS选择器和元素的以下xpath,但是这些都不起作用。当使用xpath运行时,我得到一个异常错误,说“无法定位元素”

driver.findElement(By.xpath(“/div[9]/div[2]/div/div/span/div/div/div[2]/table/tbody/tr/td[2]/table/tbody/tr/td[2]/input”);
这是弹出窗口复选框图像的链接

下面是HTML代码


创造

首先,如果您正在测试一个复杂的web应用程序,下面的答案就不会那么优雅了。如果您确实想正确地进行ExtJS ui测试,请将类名添加到相关元素中。如果你不能让开发者这么做,生活将会很悲惨

步骤1:通过cssSelector
查找窗口。x-window
或xpath
/*[包含(@class,'x-window')]

步骤2:查找所有复选框,css选择器
输入[id^='checkboxfield']
或xpath
//输入[以(@id,'checkboxfield')开头]
。或者,您也可以先找到
表[id^='checkboxfield']
,然后从中获取
输入,但逻辑是相同的

第3步:为您想要的索引

List<IWebElement> checkboxes = driver.findElements(By.cssSelector(".x-window input[id^='checkboxfield']"));
//checkboxes.size() here should be six in your case?
checkboxes[0].click();
List checkbox=driver.findElements(By.cssSelector(“.x-window输入[id^='checkboxfield']);
//复选框.size()在您的情况下应该是六个?
复选框[0]。单击();
我建议您学习如何有效地使用xpath或cssSelector。然而,我认为这个答案仍然不完美的原因是,索引元素列表不是一种稳定的方法。
只要UI发生变化,测试就会失败。如果您对该复选框有一个自定义类名,那么就容易多了,因为您可以通过其唯一的类名(例如
checkbox owner write
)找到该复选框。

我强烈建议不要尝试将Selenium与ExtJS一起使用,原因有很多。ExtJS在不同的浏览器中呈现不同的内容,因此XPath并不总是标准的(而且它们有时会在Ext版本之间发生变化)。元素ID也是动态生成的,这使得尝试使用Selenium变得更加困难。我自己没有用过,但听说午睡是一种可能的选择,你可以探索:。@kevhender:哦,是的,这很难,但不管网站有多复杂,都很好用。只要将类名添加到页面中。@1177636感谢您提出此解决方案。我能够选中所有框,对您建议的解决方案进行了少量更改。列表复选框=driver.findElements(By.cssSelector(“.x-window输入[id^='checkboxfield']”);对于(WebElement复选框:复选框){checkbox.click();}@1177636但是,对于“创建”按钮,我无法找到唯一的属性,因为“创建”和“取消”按钮的几乎所有属性都相同,除了编号正在更改的id和指定“.x-window”时无法单击的内部文本之外。@user2479333:是,您可以执行相同的
List buttons=driver.findElements(By.cssSelector(“.x-window.x-btn-button”)
,然后
按钮[0]
是创建按钮,
按钮[1]
是取消按钮。但是就像我说的,最好的方法是在源代码中添加唯一的类名。是的,我和我的同事谈过。我也能用这个点击“创建”按钮。。。。findElement(By.xpath(//div[contains(@class,'properties window')]//span[text()=“Create']”);再次感谢您…@user2479333:哦,是的,我忘了这样告诉您,因为在我的ExtJs应用程序中,它支持多种语言,按文本查找元素是不可取的。但这可能对你有用,祝你好运!