• 好的,已经修改

  • 好的,我弄一下

  • user 是实体类,是的,那个写错了,修改为 <mapper namespace="com.course.mapper.userMapper">,这个改好后问题还存在

    现在错误变为

    "C:\Program Files\Java\jdk1.8.0_202\bin\java.exe" -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always "-javaagent:D:\Java_IDE\IntelliJ IDEA 2021.1.3\lib\idea_rt.jar=50458:D:\Java_IDE\IntelliJ IDEA 2021.1.3\bin" -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_202\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_202\jre\lib\rt.jar;D:\me\java_test_pro\SpringbootMybatis\target\classes;C:\Users\DD\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.5.6\spring-boot-starter-web-2.5.6.jar;C:\Users\DD\.m2\repository\org\springframework\boot\spring-boot-starter\2.5.6\spring-boot-starter-2.5.6.jar;C:\Users\DD\.m2\repository\org\springframework\boot\spring-boot\2.5.6\spring-boot-2.5.6.jar;C:\Users\DD\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.5.6\spring-boot-autoconfigure-2.5.6.jar;C:\Users\DD\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.5.6\spring-boot-starter-logging-2.5.6.jar;C:\Users\DD\.m2\repository\ch\qos\logback\logback-classic\1.2.6\logback-classic-1.2.6.jar;C:\Users\DD\.m2\repository\ch\qos\logback\logback-core\1.2.6\logback-core-1.2.6.jar;C:\Users\DD\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.14.1\log4j-to-slf4j-2.14.1.jar;C:\Users\DD\.m2\repository\org\apache\logging\log4j\log4j-api\2.14.1\log4j-api-2.14.1.jar;C:\Users\DD\.m2\repository\org\slf4j\jul-to-slf4j\1.7.32\jul-to-slf4j-1.7.32.jar;C:\Users\DD\.m2\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;C:\Users\DD\.m2\repository\org\yaml\snakeyaml\1.28\snakeyaml-1.28.jar;C:\Users\DD\.m2\repository\org\springframework\boot\spring-boot-starter-json\2.5.6\spring-boot-starter-json-2.5.6.jar;C:\Users\DD\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.12.5\jackson-databind-2.12.5.jar;C:\Users\DD\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.12.5\jackson-annotations-2.12.5.jar;C:\Users\DD\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.12.5\jackson-core-2.12.5.jar;C:\Users\DD\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.12.5\jackson-datatype-jdk8-2.12.5.jar;C:\Users\DD\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.12.5\jackson-datatype-jsr310-2.12.5.jar;C:\Users\DD\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.12.5\jackson-module-parameter-names-2.12.5.jar;C:\Users\DD\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\2.5.6\spring-boot-starter-tomcat-2.5.6.jar;C:\Users\DD\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.54\tomcat-embed-core-9.0.54.jar;C:\Users\DD\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\9.0.54\tomcat-embed-el-9.0.54.jar;C:\Users\DD\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.54\tomcat-embed-websocket-9.0.54.jar;C:\Users\DD\.m2\repository\org\springframework\spring-web\5.3.12\spring-web-5.3.12.jar;C:\Users\DD\.m2\repository\org\springframework\spring-webmvc\5.3.12\spring-webmvc-5.3.12.jar;C:\Users\DD\.m2\repository\org\springframework\spring-aop\5.3.12\spring-aop-5.3.12.jar;C:\Users\DD\.m2\repository\org\springframework\spring-context\5.3.12\spring-context-5.3.12.jar;C:\Users\DD\.m2\repository\org\springframework\spring-expression\5.3.12\spring-expression-5.3.12.jar;C:\Users\DD\.m2\repository\org\mybatis\spring\boot\mybatis-spring-boot-starter\2.1.3\mybatis-spring-boot-starter-2.1.3.jar;C:\Users\DD\.m2\repository\org\mybatis\spring\boot\mybatis-spring-boot-autoconfigure\2.1.3\mybatis-spring-boot-autoconfigure-2.1.3.jar;C:\Users\DD\.m2\repository\org\mybatis\mybatis\3.5.5\mybatis-3.5.5.jar;C:\Users\DD\.m2\repository\org\mybatis\mybatis-spring\2.0.5\mybatis-spring-2.0.5.jar;C:\Users\DD\.m2\repository\org\projectlombok\lombok\1.18.20\lombok-1.18.20.jar;C:\Users\DD\.m2\repository\org\springframework\spring-jdbc\5.3.4\spring-jdbc-5.3.4.jar;C:\Users\DD\.m2\repository\org\springframework\spring-beans\5.3.4\spring-beans-5.3.4.jar;C:\Users\DD\.m2\repository\org\springframework\spring-core\5.3.4\spring-core-5.3.4.jar;C:\Users\DD\.m2\repository\org\springframework\spring-jcl\5.3.4\spring-jcl-5.3.4.jar;C:\Users\DD\.m2\repository\org\springframework\spring-tx\5.3.4\spring-tx-5.3.4.jar;C:\Users\DD\.m2\repository\com\alibaba\fastjson\1.2.76\fastjson-1.2.76.jar;C:\Users\DD\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\2.3.0.RELEASE\spring-boot-starter-jdbc-2.3.0.RELEASE.jar;C:\Users\DD\.m2\repository\com\zaxxer\HikariCP\3.4.5\HikariCP-3.4.5.jar;C:\Users\DD\.m2\repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;C:\Users\DD\.m2\repository\mysql\mysql-connector-java\5.1.6\mysql-connector-java-5.1.6.jar" com.course.Application
    
      .   ____          _            __ _ _
     /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
    ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
     \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
      '  |____| .__|_| |_|_| |_\__, | / / / /
     =========|_|==============|___/=/_/_/_/
     :: Spring Boot ::                (v2.5.6)
    
    2022-11-08 18:24:49.474  INFO 37164 --- [           main] com.course.Application                   : Starting Application using Java 1.8.0_202 on LAPTOP-52L2UDTT with PID 37164 (D:\me\java_test_pro\SpringbootMybatis\target\classes started by DD in D:\me\java_test_pro\SpringbootMybatis)
    2022-11-08 18:24:49.476  INFO 37164 --- [           main] com.course.Application                   : No active profile set, falling back to default profiles: default
    2022-11-08 18:24:50.259  INFO 37164 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8082 (http)
    2022-11-08 18:24:50.273  INFO 37164 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
    2022-11-08 18:24:50.273  INFO 37164 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.54]
    2022-11-08 18:24:50.343  INFO 37164 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
    2022-11-08 18:24:50.344  INFO 37164 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 834 ms
    2022-11-08 18:24:50.648  WARN 37164 --- [           main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping]: Factory method 'requestMappingHandlerMapping' threw exception; nested exception is java.lang.NoSuchMethodError: org.springframework.core.log.LogDelegateFactory.getHiddenLog(Ljava/lang/String;)Lorg/apache/commons/logging/Log;
    2022-11-08 18:24:50.648  WARN 37164 --- [           main] .s.c.a.CommonAnnotationBeanPostProcessor : Destroy method on bean with name 'application' threw an exception: java.lang.NullPointerException
    2022-11-08 18:24:50.650  INFO 37164 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
    2022-11-08 18:24:50.659  INFO 37164 --- [           main] ConditionEvaluationReportLoggingListener : 
    
    Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
    2022-11-08 18:24:50.669 ERROR 37164 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 
    
    ***************************
    APPLICATION FAILED TO START
    ***************************
    
    Description:
    
    An attempt was made to call a method that does not exist. The attempt was made from the following location:
    
        org.springframework.web.servlet.handler.AbstractHandlerMapping.<init>(AbstractHandlerMapping.java:83)
    
    The following method did not exist:
    
        org.springframework.core.log.LogDelegateFactory.getHiddenLog(Ljava/lang/String;)Lorg/apache/commons/logging/Log;
    
    The method's class, org.springframework.core.log.LogDelegateFactory, is available from the following locations:
    
        jar:file:/C:/Users/DD/.m2/repository/org/springframework/spring-core/5.3.4/spring-core-5.3.4.jar!/org/springframework/core/log/LogDelegateFactory.class
    
    The class hierarchy was loaded from the following locations:
    
        org.springframework.core.log.LogDelegateFactory: file:/C:/Users/DD/.m2/repository/org/springframework/spring-core/5.3.4/spring-core-5.3.4.jar
    
    
    Action:
    
    Correct the classpath of your application so that it contains a single, compatible version of org.springframework.core.log.LogDelegateFactory
    
    
    Process finished with exit code 1
    
    
  • 谢谢,这个改好了,问题还是存在

  • <dependencies>
    
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.7.4</version>
            <type>pom</type>
        </dependency>
    
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
            <version>2.3.0.RELEASE</version>
        </dependency>
    
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.7.0</version>
        </dependency>
    
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.7.0</version>
        </dependency>
    
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
        </dependency>
    
        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
            <version>2.0.15</version>
        </dependency>
    
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>
    
    </dependencies>
    

    这是我的依赖项,还专门处理过版本

  • 添加完后

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
        <version>2.3.0.RELEASE</version>
    </dependency>
    

    还是报上面那个错误

  • 😂 ,这个项目难以定位元素,图方便,使用了浏览器的获取 xpath,控件的 xpath 是正确的,我修改一下,加上显式等待试试

  • import time
    import os
    from selenium import webdriver
    from common.basic import Base
    from common.read_image import ocr
    from selenium.webdriver.common.by import By
    from config.conf import img_address
    
    
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get("https://wlsq.daishan.gov.cn/ddWeb/user/login")
    time.sleep(10)
    # 登录
    driver.find_element(By.XPATH, '//span[@class = "ant-input-affix-wrapper ant-input-affix-wrapper-lg"]/input[@placeholder="请输入帐户名"]').send_keys("cxc")
    driver.find_element(By.XPATH, '//span[@class = "ant-input-affix-wrapper ant-input-affix-wrapper-lg"]/input[@placeholder="请输入密码"]').send_keys("admin123456?")
    img = Base(driver).screenshot(os.path.join(img_address, str(int(time.time())) + ".png"))
    text = ocr(img)
    driver.find_element(By.XPATH, '//span[@class = "ant-input-affix-wrapper ant-input-affix-wrapper-lg"]/input[@placeholder="请输入验证码"]').send_keys(text)
    driver.find_element(By.XPATH, '//button[@class="login_btn"]').click()
    time.sleep(20)
    # 点击基础数据
    driver.find_element(By.XPATH, "//html[@id='htmlRoot']//div[@id='app']/div[@class='home-large']/div[@class='home-large-content']//div[@class='slick-track']/div//div[@class='home-large-content-item']//span[.=' 基础数据库 ']").click()
    time.sleep(5)
    # 添加基础人口
    driver.find_element(By.XPATH, "//div[@class='table-operator']/button[@class='ant-btn ant-btn-primary']").click()
    time.sleep(5)
    # 输入姓名
    driver.find_element(By.XPATH, "//div[@class='ant-form-item-control']/span[@class='ant-form-item-children']/input[@id='name']").send_keys("小龙")
    time.sleep(5)
    # 出生日期
    driver.find_element(By.XPATH, "//span[@class='ant-calendar-picker']/div/input[@placeholder='请选择出生日期']").click()
    # 出生日期输入框
    driver.find_element(By.XPATH, "//div[@class='ant-calendar-panel']/div[@class='ant-calendar-input-wrap']/div[@class='ant-calendar-date-input-wrap']/input[@placeholder='请选择出生日期']").send_keys("1858-02-02")
    # 点击地址
    time.sleep(5)
    driver.find_element(By.XPATH, '//input[@id="building_address_info"]').click()
    # 点击地址页面搜索框
    driver.find_element(By.CSS_SELECTOR, 'input[placeholder="请输入地址"]').send_keys("舟山市岱山县外达昆西南约330米")
    time.sleep(5)
    # 地址库页面查询按钮
    driver.find_element(By.XPATH, "//html[@id='htmlRoot']/body/div[5]/div/div[@role='dialog']/div[@role='document']//form[@class='ant-form ant-form-inline']/div[@class='ant-row']//span[@class='table-page-search-submitButtons']/button[1]").click()
    # 地址库页面选中数据
    driver.find_element(By.XPATH, '//table[@class="ant-table-fixed"]/tbody[@class="ant-table-tbody"]/tr[@class="ant-table-row ant-table-row-level-0"]/td[3]').click()
    # 地址库页面点击确定
    driver.find_element(By.XPATH, '//div[@class="ant-modal-footer"]/div/button[2]').click()
    time.sleep(5)
    # 选择户口类别
    driver.find_element(By.XPATH, '//div[@class="ant-form-item-control"]/span/div[@id="household_registration_category"]/div[@role="combobox"]/div').click()
    # 选择户籍人口
    driver.find_element(By.XPATH, "//html[@id='htmlRoot']/body/div[5]/div/div[@role='dialog']/div[@role='document']//div[@class='ant-select-dropdown-content']/ul[@role='listbox']/li[1]/span[@title='户籍人口']").click()
    # 选择性别
    driver.find_element(By.XPATH, "//html[@id='htmlRoot']//div[@id='sex']//div[@class='ant-select-selection__placeholder']").click()
    # 男
    driver.find_element(By.XPATH, "//html[@id='htmlRoot']/body/div[3]/div/div[@role='dialog']/div[@role='document']//div[@class='ant-select-dropdown-content']/ul[@role='listbox']/li[2]/span[@title='男']").click()
    # 联系方式
    driver.find_element(By.XPATH, "//html[@id='htmlRoot']//input[@id='phone_number']").send_keys("15203141442")
    # 证件号码
    driver.find_element(By.XPATH, "//html[@id='htmlRoot']//input[@id='id_card']").send_keys("42010119720727663X")
    # 入户状态
    driver.find_element(By.XPATH, "//html[@id='htmlRoot']//div[@id='household_status']//div[@class='ant-select-selection__placeholder']").click()
    # 点击一致
    driver.find_element(By.XPATH, "//html[@id='htmlRoot']/body/div[3]/div/div[@role='dialog']/div[@role='document']/div[@class='ant-modal-content']/div[5]/div/div[@class='ant-select-dropdown ant-select-dropdown--single ant-select-dropdown-placement-bottomLeft']/div[@class='ant-select-dropdown-content']/ul[@role='listbox']/li[1]/span[@title='一致']").click()
    # 点击确定
    driver.find_element(By.XPATH, "//html[@id='htmlRoot']/body/div[3]/div/div[@role='dialog']/div[@role='document']//div[@class='ant-modal-footer']/button[1]")
    time.sleep(10)
    driver.close()
    

    运行后

    Traceback (most recent call last):
      File "D:/dingdang_project/DDJX_ChangTu/libs/Q_test.py", line 69, in <module>
        driver.find_element(By.XPATH, "//html[@id='htmlRoot']/body/div[5]/div/div[@role='dialog']/div[@role='document']//div[@class='ant-select-dropdown-content']/ul[@role='listbox']/li[1]/span[@title='户籍人口']").click()
      File "D:\work software\python3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 978, in find_element
        'value': value})['value']
      File "D:\work software\python3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
        self.error_handler.check_response(response)
      File "D:\work software\python3\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
        raise exception_class(message, screen, stacktrace)
    selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//html[@id='htmlRoot']/body/div[5]/div/div[@role='dialog']/div[@role='document']//div[@class='ant-select-dropdown-content']/ul[@role='listbox']/li[1]/span[@title='户籍人口']"}
      (Session info: chrome=99.0.4844.51)
    
  • 运行两次点击会报:AttributeError: 'NoneType' object has no attribute 'click'


  • 现在主要用了这个 click 方法

  • 我使用了两种方法:
    首先是 selenium 的 click 点击下拉框,然后点击下拉框下的元素,这种方法点击不上下拉框的元素
    第二种是使用了 Select 这个包对下拉框的数据进行定位,还是不成功


  • 但是运行 python 代码的时候下拉框的数据会因为没有点击的点位找不到的,就算手动点击后源代码里面的数据写到 python 代码上还是提示找不到该位置

  • 我定位元素的代码吗,现在是没办法定位元素的

  • 这个是封装在接口里面的,selenium 那个是直接把下拉框的数据写在代码中,直接能看到的,这个是只有点击元素,元素位置才会显示在源代码中

  • 这种找不到的,点击下拉框里面的元素之后,元素的位置才显示在源代码中,如果这样运行,python 会找不到那个元素的位置

  • 目前的解决方案:在 conftest.py 里面编写的 login 用例用 yield 把 driver 传递出来,后面的用例直接引用 login, login 和 login 后面的操作就使用的同一个 driver

  • 好的,谢谢

  • pytest 的用例不能有init

  • 之前用了一下,这种的还是不行

  • ok,了解了,谢谢您的回答

  • 还是报错的

        def add_actual_population(self, name, phone, id_card):
    >       self.driver.click(section="HomePageElements", option="Basic_database")
    E       AttributeError: 'NoneType' object has no attribute 'click'
    
  • 真好用,点赞👍

  • 是的,我登录后就到了首页,然后再运行另一个用例时要点击首页上的按钮,提示找不到元素,所以想到有可能是登录和登录后操作没有关联

  • 好的,我修改一下,谢谢😀

  • 又运行了一下,莫名其妙的好了😂 ,谢谢各位的帮忙了 😀