selenium定位执行click操作的时候总是不对

在练习企业微信项目的时候,定位首页的添加成员控件,执行click操作,总是会点击到“打卡”控件,但是执行获取文本操作(element.text)的时候又能正常获取,代码如下:

from time import sleep
from selenium import webdriver
from selenium.webdriver.remote.webdriver import WebDriver


class BasePage:
    _base_url = ""

    def __init__(self, driver: WebDriver = None):
        if driver is None:
            chrome_opts = webdriver.ChromeOptions()
            chrome_opts.debugger_address = "127.0.0.1:9222"
            self.driver = webdriver.Chrome(options=chrome_opts)
            self.driver.get(self._base_url)
            sleep(3)
        else:
            self.driver = driver
        self.driver.maximize_window()
        self.driver.implicitly_wait(3)

    def find(self, by, locator):
        return self.driver.find_element(by, locator)

from selenium.webdriver.common.by import By
from pageobject.page.add_member import AddMember
from pageobject.page.base_page import BasePage


class IndexPage(BasePage):
    _base_url = "https://work.weixin.qq.com/wework_admin/frame#index"
    def goto_add_member(self):
        self.find(By.CSS_SELECTOR, ".index_service_cnt.js_service_list a:nth-child(1)").click()  # 这里执行click就会点击到“打卡”
        # element=self.find(By.CSS_SELECTOR, ".index_service_cnt.js_service_list a:nth-child(1)")
        # print(element.text)  # 这里获取文本又没有问题
        return AddMember(self.driver)

from pageobject.page.index import IndexPage


class TestIndex:
    def setup(self):
        self.index = IndexPage()

    def teardown(self):
        self.index.driver.quit()

    def test_click_add_member(self):
        self.index.goto_add_member()

from pageobject.page.base_page import BasePage


class AddMember(BasePage):
    def save(self):
        pass

情况分析

  • 我试了一下在我这里点击和获取都没有问题,都是 添加成员
  • 我大概猜一下,是不是因为你的网页加载速度比较慢 导致有时候没加载完的情况下去find elemenet会导致找回的元素并不是你想要的那个元素,因为你的CSS_SELECTOR 是用的上下级关系和顺序来定位的,可能在某一个页面加载和初始化的时刻,打卡按钮是这个列表的第一个元素,就导致获取回来的是这个元素了。

解决方案

  • 1.尝试一下使用(By.CSS_SELECTOR, ‘[node-type=“addmember”]’)定位试一下看看呢?
  • 2.或者是在定位先加个sleep等待试一下,如果加了之后没有报错可能就是加载的问题,你可以考虑写个显式等待来避免这种布局没有加载完整或者加载中导致的按上下级定位出问题的情况。

你用的是浏览器复用?还是用的cookie?
我今天试了使用cookie或者直接扫码登录时可以准确点击的的,但是使用浏览器复用的话就会出问题(可以获取text,但是点击的时候跳转到了打卡,),我认为定位应该没什么毛病,可能是复用浏览器上有什么坑

试了一下浏览器复用也没有你说的这个问题,建议你先按照我说的试一下看看,排除一下加载不完整什么的问题。

你数等待加载时间昨天就试过了。 今天改成使用cookie或者直接扫码登录,并没有去修改测试代码,仅仅是将base_page.py文件中的登录企业微信的方式修改了,可以和顺利的跑起来

而且使用复用浏览器的时候,如果是元素没有加载出来怎么可以找到他的text文本呢,所以不是没有加载完的问题

并且现在,把之前的等待时间去掉,也是可以顺利点击的

因为我看你代码的顺序,貌似并不是在一次执行中先打印了text然后再去click,而是分次打印text或者是click的,所以我才有这种猜测,至于为什么修改了登录方式就好了那就不知道了。。我只是给了个建议觉得定位方式修改一下的话可以避免一些可能的问题,当然问题只要解决了就OK。

原因找到了,我的浏览器默认情况下打开是90%缩放的,在使用浏览器复用的时候,使用chrome打开的浏览器也是90%的缩放比例,因此在执行用例的时候会出现能够定位到元素、也能获取元素的text,但是点击的时候就会出问题,比如我在点击添加成员的时候就点击到打卡了(个人猜测,selenium按照页面缩放100%的位置是点击的,但是不知道怎么验证)

页面缩放的情况下点击不准这个问题老师上课提到过,selenium是通过控件坐标来点击的 可能是因为这个原因导致缩放点击不准确或者点击不到吧