zoukankan      html  css  js  c++  java
  • Python+selenium学习(二) selenium 定位不到元素

    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>() {

    @Override
    public 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 {
    //页面加载超时时间设置为5s
    driver.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("隐式等待");
    //异步脚本的超时时间设置成3s
    driver.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");
    }
    }

  • 相关阅读:
    python目录操作【os和os.path】
    Zabbix4.0 zabbix 快速监控主机
    Zabbix 4.0 钉钉报警
    MySql:sql99语法的连接查询
    bat脚本中存在多条指令,但只执行到某条指令不继续向下执行的一种解决方法
    基类与接口类中的虚析构函数(virtual destructor)
    TortoiseGit使用指南;
    Rust编译问题Blocking waiting for file lock on package cache
    win10安装visual C++ 6.0,在最后显示安装程序正在更新您的系统,然后就无响应
    从实现装饰者模式中思考C++指针和引用的选择
  • 原文地址:https://www.cnblogs.com/Reclouds-shangri-la/p/10512995.html
Copyright © 2011-2022 走看看