一、内容
本文主要练习一下:
1.运行的环境和框架
2.滚动加载的操作
3.切换窗口
4.悬停操作
二、题目流程
三、代码
package cst;
import org.apache.commons.io.FileUtils;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Set;
import java.util.concurrent.TimeUnit;
public class myTest {
private WebDriver driver;
@BeforeEach
public void setUp(){
System.setProperty("webdriver.chrome.driver", "C:\\google\\chrome-win64\\chrome-win64\\chromedriver.exe");
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
driver = new ChromeDriver(options);
driver.get("https://www.baidu.com/");
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}
@Test
public void test_UI() throws InterruptedException {
System.out.println(1);
driver.findElement(By.id("kw")).sendKeys("java" + Keys.ENTER);
//滚动加载方法一
JavascriptExecutor executor = (JavascriptExecutor) driver;
WebElement java = driver.findElement(By.cssSelector("._no-spacing_lzhxo_29 em"));
//如果移到的这个地方被导航栏遮住了
int visible = java.getLocation().y;
executor.executeScript("window.scrollTo(0," + (visible - 190) + ")");
//注意:这里的winodow.scrollTo(0,visible)是滚动到可见区域,如果visible是负数,则向上滚动,如果是正数,则向下滚动,w是小写
java.click();
//切换窗口方法一
driver.switchTo().window(driver.getWindowHandles().toArray()[1].toString());
System.out.println(driver.getTitle());
//悬停操作,perform()是执行前面所有的操作
Actions actions = new Actions(driver);
Thread.sleep(2000);
WebElement zhiShi = driver.findElement(By.xpath("//*[@id=\"root\"]/div/div[1]/div[5]/div[1]/div/dl[4]/dt/a"));
actions.moveToElement(zhiShi).perform();
driver.findElement(By.linkText("环游《山海经》")).click();
//切换窗口方法二
Set<String> windows = driver.getWindowHandles();
ArrayList<String> windowList = new ArrayList<>(windows);
driver.switchTo().window(windowList.get(windows.size()-1));
System.out.println(driver.getTitle());
//滚动加载方法二,点击扶桑树,要先滑到这里在进行点击
WebElement image = driver.findElement(By.xpath("//*[@id=\"vertical-5\"]/div[2]/div/div[1]/div/div[1]/a/div[1]/div[2]"));
executor.executeScript("arguments[0].scrollIntoView(true)", image);
executor.executeScript("window.scrollTo(0,-70)");
image.click();
//获得当前页面的标题
Set<String> windows1 = driver.getWindowHandles();
ArrayList<String> windowList1 = new ArrayList<>(windows1);
driver.switchTo().window(windowList1.get(windows1.size()-1));
System.out.println(driver.getTitle());
//返回百科专题页面,并关掉此页面
Set<String> windows2 = driver.getWindowHandles();
ArrayList<String> windowList2 = new ArrayList<>(windows2);
driver.switchTo().window(windowList2.get(windows2.size()-2));
System.out.println(driver.getTitle());
Thread.sleep(2000);
driver.close();
//再关闭扶桑花页面
driver.switchTo().window(driver.getWindowHandles().toArray()[2].toString());
System.out.println("________");
driver.close();
}
@AfterEach
public void teatDown() throws InterruptedException {
Thread.sleep(2000);
//this.driver.quit();
}
public void takeScreenShot(String fileName){
File file = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
try {
FileUtils.copyFile(file, new File("C:\\Users\\Administrator\\Desktop\\screenshot\\"+fileName+".png"));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
四、总结
当你点击不到或输入不进去值的时候,可能是因为:
1.没切换到当前的窗口
2.有iframe,要先切换到iframe里,在进行操作,要操作位于iframe之外的元素,也要先切换出来
WebElement iframe = driver.findElement(By.xpath("//iframe[@scrolling=\"no\"]"));
driver.switchTo().frame(iframe);
driver.switchTo().defaultContent();
3.网速太慢 ,用显示等待或隐式等待
还有一个下拉框(比如选择家住在在哪个省份)
WebElement select_table = driver.findElement(By.xpath("/html/body/table/tbody/tr[6]/td[2]/select"));
Select select = new Select(select_table);
//通过顺序选择 0开始
select.selectByIndex(4);//陕西
Thread.sleep(1000);
//通过文字选择
select.selectByVisibleText("北京");
Thread.sleep(1000);