我已经编写了代码,当我在调试模式下运行时效果很好,但是当我在正常模式下运行它时,我收到以下异常
org.openqa.selenium.NoSuchElementException: no such element:
Unable to locate element: {"method":"xpath","selector":".//*[@id='address-0']/span"}
我写的代码是:
WebElement searchBox = driver.findElement(By.id("search-input"));
searchBox.sendKeys("somepostcode");
Actions actions = new Actions(driver);
actions.moveToElement(searchBox);
WebElement address = driver.findElement(By.xpath(".//*[@id='address-0']/span"));
actions.moveToElement(address);
actions.click();
actions.perform();
我不明白我应该在哪里等待。
我正在使用 Eclipse IDE。该功能的工作原理就像当我在搜索框中输入一些邮政编码时,它会在运行时搜索一些地址,并且用户必须选择与邮政编码相关的任何地址。已使用 Ajax 获取邮政编码
这里的搜索框是一个文本框。
如果需要更多信息,请告诉我。
尝试在之前增加一些等待时间
WebElement address = driver.findElement(By.xpath(".//*[@id='address-0']/span"));
错误告诉您,您正在尝试在页面上可见之前创建 WebElement“地址”的实例。 尝试在之前添加等待
WebElement address = driver.findElement(By.xpath(".//*[@id='address-0']/span"));
在这种情况下,当脚本在调试模式下工作但在正常模式下失败时,这几乎总是时序问题。因此,当您尝试查找该元素时,您的页面尚未完全加载。
在有问题的元素之前放置显式等待。使用显式等待通常不是最佳实践,但您可以快速尝试一下,看看是否能解决您的问题。如果是这样,您可以稍后将其重构为更可靠的解决方案。
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
希望这会帮助你..
WebElement searchBox = driver.findElement(By.id("search-input"));
searchBox.sendKeys("somepostcode");
Actions actions = new Actions(driver);
actions.moveToElement(searchBox);
WebDriverWait wait = new WebDriverWait(driver, 20);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(".//*[@id='address-0']/span")));
WebElement address = driver.findElement(By.xpath(".//*[@id='address-0']/span"));
actions.moveToElement(address);
actions.click();
actions.perform();
我通过将邮政编码分成两部分解决了这个问题
searchBox.sendKeys("postcodePart1");
searchBox.sendKeys("postcodePart2");
一定有某种 on Change 事件正在调用。
不要使用Actionchains,而是直接使用driver.find_element(By.XPATH, "xxxxxx").send_keys( “xxxxx”) 有时在运行模式下,它将焦点移出字段,导致其无法输入文本。