Python+selenium学习(二) selenium 定位不到元素

it2022-05-05  117

转载:https://www.cnblogs.com/tarrying/p/9681991.html

tarrying

 

selenium的三种等待时间

//隐式等待(20秒以内没哥一段时间就会去找元素,如果没找大也不会报错,过了20s才会报错) //driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); //显示等待 WebDriverWait wait = new WebDriverWait(driver,10); wait.until(ExpectedConditions.presenceOfElementLocated(By.id("test"))); //线程等待 Thread.sleep(2000);

参考:https://www.cnblogs.com/linxinmeng/p/6930197.html

 

selenium 找不到元素 (显式等待 和隐式等待的区别)

 

selenium自动化页面元素不存在异常发生的原因有一下几点:

(1)页面加载时间过慢,需要查找的元素程序已经完成但是页面还未加载成功。此时可以加载页面等待时间。

(2)查到的元素没有在当前的iframe或者frame中。此时需要切换至对应的iframe或者frame中才行。

 (3)元素错误。

解决页面加载时间所引起的元素找不到,我们可以为页面设置加载时间。时间的设置分为以下三种:

(1)显式等待

显示等待是针对于某个特定的元素设置的等待时间,如果在规定的时间范围内,没有找到元素,则会抛出异常,如果在规定的时间内找到了元素,则直接执行,即找到元素就执行相关操作。

public static void main(String[] args) throws IOException {

System.setProperty("webdriver.chrome.driver", "D:/chromedriver_win32/chromedriver.exe");ChromeOptions Options = new ChromeOptions();Options.addArguments("user-data-dir=C:\\Users\\happy\\AppData\\Local\\Google\\Chrome\\User Data");WebDriver driver = new ChromeDriver(Options);try {

WebDriverWait wait = new WebDriverWait(driver, 10, 1);// 每隔1秒去调用一下until中的函数,默认是0.5秒,如果等待10秒还没有找到元素 。则抛出异常。wait.until(new ExpectedCondition<WebElement>() {

@Overridepublic WebElement apply(WebDriver driver) {driver.findElement(By.id("kw"));

return driver.findElement(By.id("kw"));}

}).sendKeys("我是一个自动化测试小脚本");

} finally {driver.close();Runtime.getRuntime().exec("taskkill /F /im " + "chromedriver.exe");Runtime.getRuntime().exec("taskkill /F /im " + "chrome.exe");}}

(2)隐式等待

隐式等待是设置的全局等待,分为1、页面加载超时等待 ;2、页面元素加载超时;3、异步脚本超时

如果是页面元素超时,设置等待时间,是对页面中的所有元素设置加载时间。隐式等待是其实可以理解成在规定的时间范围内,浏览器在不停的刷新页面,直到找到相关元素或者时间结束。

public static void main(String[] args) throws IOException {

System.setProperty("webdriver.chrome.driver", "D:/chromedriver_win32/chromedriver.exe");ChromeOptions Options = new ChromeOptions();Options.addArguments("user-data-dir=C:\\Users\\happy\\AppData\\Local\\Google\\Chrome\\User Data");WebDriver driver = new ChromeDriver(Options);try {//页面加载超时时间设置为5sdriver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);driver.get("https://www.baidu.com/");//定位对象时给10s 的时间, 如果10s 内还定位不到则抛出异常driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);driver.findElement(By.id("kw")).sendKeys("隐式等待");//异步脚本的超时时间设置成3sdriver.manage().timeouts().setScriptTimeout(3, TimeUnit.SECONDS);} finally {driver.close();Runtime.getRuntime().exec("taskkill /F /im " + "chromedriver.exe");Runtime.getRuntime().exec("taskkill /F /im " + "chrome.exe");}}

(3)线程等待

线程等待是java语言中的线程类Thread类中的sleep()方法。此等待是很死板的,需要等待时间结束才会执行相关代码。该方法需要抛出InterruptedException 异常。一般不建议使用,但是在弹窗处理,可以优先选择线程等待。

public static void main(String[] args) throws IOException, InterruptedException {

System.setProperty("webdriver.chrome.driver", "D:/chromedriver_win32/chromedriver.exe");ChromeOptions Options = new ChromeOptions();Options.addArguments("user-data-dir=C:\\Users\\happy\\AppData\\Local\\Google\\Chrome\\User Data");WebDriver driver = new ChromeDriver(Options);try {

Thread.sleep(5000);driver.findElement(By.id("kw")).sendKeys("线程等待");} finally {driver.close();Runtime.getRuntime().exec("taskkill /F /im " + "chromedriver.exe");Runtime.getRuntime().exec("taskkill /F /im " + "chrome.exe");}}

转载于:https://www.cnblogs.com/Reclouds-shangri-la/p/10512995.html


最新回复(0)