下面是我的代码,该行=>
driver.findElement(By.xpath("//*[@id=\"quote_password\"]")).sendKeys("password");
引发找不到元素的异常
@Test
public void mytest()
{
System.setProperty("webdriver.chrome.driver","Drivers/chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get("http://billing.scriptinglogic.net/index.php/sessions/login");
driver.findElement(By.xpath("//*[@id='email']")).sendKeys("email");
driver.findElement(By.xpath("//*[@id='password']")).sendKeys("password");
driver.findElement(By.xpath("/html/body/div/div/form/input")).click();
driver.findElement(By.xpath("//*[text()='Quotes']")).click();
driver.findElement(By.xpath("//*[text()='Create Quote']")).click();
driver.findElement(By.xpath("//*[@id=\"quote_password\"]")).sendKeys("password");
}
答案 0 :(得分:1)
快速而肮脏的解决方案:
WebDriverWait wait = new WebDriverWait(driver, 15, 100);
driver.get("http://billing.scriptinglogic.net/index.php/sessions/login");
driver.findElement(By.id("email")).sendKeys("<EMAIL>");
driver.findElement(By.id("password")).sendKeys("<PASSWORD>");
driver.findElement(By.name("btn_login")).click();
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[text()='Quotes']"))).click();
wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(".create-quote"))).click();
wait.until(ExpectedConditions.elementToBeClickable(By.id("quote_password"))).sendKeys("password");
根据下面的注释中提供的凭据进行更新。我对选择器进行了调整,以在适用的情况下使用ID,名称和类。不需要时,无需使用复杂的XPath定位器。
需要根据网站的工作方式进行明确的等待,我添加了JeffC的建议,即对输入元素使用elementToBeClickable期望条件(在这种情况下,我认为实际上并不是必需的,因为该网站似乎从未禁用过输入字段,因此visibleOfElementLocated预期条件确实一样好)。
此解决方案对我来说适用于Chrome和Firefox(标准模式)以及Firefox(无头模式)。它无法在Chrome的无头模式下工作,因为屏幕尺寸较小,并且当屏幕宽度低于1000px时,标题会更改,并且永远不会显示文本“ Quotes”。在767px以下,标题将被完全删除,您会看到一个侧面菜单。这意味着脚本的流程需要根据分辨率稍作更改。
我建议您要求开发人员在菜单项中添加一个ID,这样可以更轻松地找到它们并在各种状态下使用该网站。快速而肮脏的解决方案是确保测试运行时浏览器具有一定的大小,您可以通过在脚本的第一行中设置大小来实现:
driver.manage().window().setSize(new Dimension(1024, 768));
执行此操作时,它将以标准无头模式在Firefox和Chrome中传递。
注意: 带有明确等待状态并导致元素被单击的行是锚元素,因此没有一点可以等待元素被单击因为条件总是会返回true。