我正在尝试使用Selenium(Java)来自动执行某些搜索。
当我转到该页面并单击搜索栏上的Inspect Element时,我发现它具有ID searchBox
和名称q
,这两个都可能有用。然而,当我转到View Source时,这些属性在HTML中找不到。
当我尝试使用
时WebElement search = driver.findElement(By.id("searchBox"));
或
WebElement search = driver.findElement(By.name("q"));
两人都回来了,因为无法找到。
如果我找不到其中任何一个元素,如何继续填充搜索字段然后点击提交(源页面中也缺少提交按钮)?
修改
根据要求,这里有一个更详细的错误图片:
WebDriver访问的网页网址为http://www.ycharts.com,使用
行driver.get("http://www.ycharts.com/login");
如果您使用实际的网络浏览器访问此页面,请右键单击搜索栏并选择“检查元素”,您将看到其ID为“searchBox”且其名称为“q”。但是,如果您去查看同一页面的源代码,您会发现HTML中没有这样的元素。显然,这就是WebDriver无法找到它的原因。
driver
启动如下:
WebDriver driver = new HtmlUnitDriver();
当我尝试像
这样的东西时WebElement search = driver.findElement(By.id("searchBox"));`
返回的异常是:
Exception in thread "main" org.openqa.selenium.NoSuchElementException: Unable to locate element with ID: searchBox
所以,回到最初的问题:显然,元素存在,但它不在HTML中 - 你如何与它互动?
答案 0 :(得分:2)
问题是由于javascript将搜索框添加到html帖子页面加载的事实。
http://ycharts.com/返回的HTML不包含搜索框,因此当Selenium认为页面已完成加载(即DOM就绪状态)时,没有搜索框。
为了与搜索框进行交互,您需要告诉Selenium等待该框出现在DOM中。
实现这一目标的最简单方法是使用WebDriverWait;
WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id<locator>));