我正在使用WebDriver用Java编写程序,在选择webElement之后获取文本有些麻烦。
我想要的网站部分的HTML代码如下:
法兰西 <div id="content">
<div id="Pagination"></div>
<div id="mid">
</div>
</div>
用于语言的搜索栏和下拉栏的文本框类代码
我的Java代码当前能够使用chrome驱动程序打开chrome,并且能够在搜索栏中键入内容。但是,我无法获得该条目产生的文本。
在这里的图像中,我在搜索栏中输入了“ avoir”,我希望框内的所有文本在xpath中似乎都没有要使用的ID或名称。
在下拉语言菜单之后,有人可以帮助我找到如何从这些字段中获取和保存文本吗?
提前谢谢!
我到目前为止的代码:
//import statements not shown
public class WebScrapper {
public WebScrapper() {
}
public WebDriver driver = new ChromeDriver();
public void openTestSite() {
driver.navigate().to(the URL for the website);
}
public void enter(String word) {
WebElement query_editbox =
driver.findElement(By.id("query"));
query_editbox.sendKeys(word);
query_editbox.sendKeys(Keys.RETURN);
}
public void getText() {
//List<WebElement> searchResults =
driver.findElements(By.xpath("//div[@id='mid']/div"));
// Writer writer = new BufferedWriter(new
OutputStreamWriter(new FileOutputStream("status.txt"),
"utf-8"));
//int[] index = {0};
WebElement result=driver.findElement(By.id("mid"));
System.out.println(result.getText());
}
public static void main(String[] args) throws IOException {
System.setProperty("webdriver.chrome.driver", "chromedriver");
System.out.println("Hello");
WebScrapper webSrcapper = new WebScrapper();
webSrcapper.openTestSite();
webSrcapper.enter("avoir");
webSrcapper.getText();
System.out.println("Hello");
}
}
答案 0 :(得分:1)
为了检查与查询相关的结果,常见的策略是加载搜索结果列表:
List<WebElement> searchResults = driver.findElements(By.xpath("//div[@id='mid']/div"));
现在,通过从每个结果的子元素中获取文本,您可以使用流来遍历列表并提取相关文本:
int[] index = {0};
searchResults.stream().forEach(result -> {
System.out.println("Printing query result of index: " + index[0]);
result.findElements(By.xpath(".//*")).stream().forEach(webElement -> {
try {
System.out.println(webElement.getText());
} catch (Exception e) {
// Do nothing
}
});
index[0]++;
});
您将得到输出:
答案 1 :(得分:1)
我指定了三种从结果框中提取文本的方法。请检查所有方法并使用所需的方法。
如果要提取所有文本,则可以找到结果框的元素,然后从中获取文本。
WebElement result=driver.findElement(By.id("mid"));
System.out.println(result.getText());
如果您要按节提取文本,则可以采用以下方法,
List<WebElement> sectionList=driver.findElements(By.xpath("//div[@id='mid']/div"));
int i=0;
for(WebElement element:sectionList){
System.out.println("Section "+i+":"+element.getText());
i++;
}
如果要从特定部分提取文本,则可以采用以下方法
List<WebElement> sectionList=driver.findElements(By.xpath("//div[@id='mid']/div"));
int i=0;
//Inorder to get the Section 3 Content
int section=2;
for(WebElement element:sectionList){
if(section==i){
System.out.println("Section "+i+":"+element.getText());
}
i++;
}
修改:解决后续问题
我建议在执行某些操作后使用一些显式等待,从而导致某些元素呈现。在您的代码中,进行了一些修改后,我得到了预期的结果。
openTestSite
方法中,我刚刚添加了显式等待,以确保在加载URL之后加载页面enter
方法中,实际上您是在输入查询值后得到自动完成建议的。因此,我们只需从自动完成中选择该值即可。getText
方法中,搜索结果会花费更多时间。因此,我们需要使用任何一个动态加载元素定位器添加一些显式等待。代码:
openTestSite方法:
public void openTestSite() {
//driver.navigate().to(the URL for the website);
driver.get("https://wonef.fr/try/");
driver.manage().window().maximize();
//Explicit wait is added after the Page load
WebDriverWait wait=new WebDriverWait(driver,20);
wait.until(ExpectedConditions.titleContains("WoNeF"));
}
输入方法:
public void enter(String word) {
WebElement query_editbox =
driver.findElement(By.id("query"));
query_editbox.sendKeys(word);
//AutoComplete is happening even after sending the Enter Key.
// So, Value needs to be selected from the autocomplete
WebDriverWait wait=new WebDriverWait(driver,20);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='autocomplete']/div")));
List<WebElement> matchedList=driver.findElements(By.xpath("//div[@class='autocomplete']/div"));
System.out.println(matchedList.size());
for(WebElement element : matchedList){
if(element.getText().equalsIgnoreCase(word)){
element.click();
}
}
//query_editbox.sendKeys(Keys.RETURN);
}
getText方法:
public void getText() {
WebDriverWait wait=new WebDriverWait(driver,20);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@id='mid']/div")));
WebElement result=driver.findElement(By.id("mid"));
System.out.println(result.getText());
}
我已经使用上述修改后的代码进行了测试,并且工作正常。