selenium.common.异常.ElementNotVisibleException:消息:元素不可交互且显式等待不与Selenium和Python一起工作

2024-04-26 10:58:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图访问PenFed以获取当前未付金额。我做了相当多的研究,但不幸的是,我仍然被难住了。我使用的是pythonselenium,我试图单击侧面的初始登录按钮以查看用户名字段。这是元素的HTML代码:

<a href="https://www.penfed.org/" class="pfui-button-login login-slide-button pfui-button pfui-btn-tertiary-dark-blue-outline" id="mobile-login" data-di-id="#mobile-login">Login</a>

当我尝试运行以下代码时:

^{pr2}$

我得到以下错误:

^{3}$

即使我尝试使用WebDriver等待函数,例如:

try:
    WebDriverWait(driver, 5).until(EC.visibility_of_element_located((By.ID, "mobile-login"))).click()
except ElementNotVisibleException:
    WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.ID, "mobile-login"))).click()

不管我让他们等多久,我都会收到一条超时消息:

raise TimeoutException(message, screen, stacktrace) selenium.common.exceptions.TimeoutException: Message:

我所有的研究都说,调用wait函数应该可以解决这个问题,但它对我不起作用。我还读到,在点击按钮之前,我必须调用元素的顶部可能有一个图像覆盖,但我在网站代码中也没有看到任何内容。如果我正在测试它,我能够通过代码点击按钮的唯一方法是先实际单击它,所以我不知道还有什么可以使用的。提前感谢您的帮助!在

更新:我发现以下代码适用于我:

element = driver.find_element_by_id("mobile-login")
driver.execute_script("$(arguments[0]).click();", element)

但我不知道execute_脚本的实际用途。或者有人能解释其他的代码吗?在


Tags: 函数代码id元素driverloginbuttonelement
3条回答

所需元素是一个动态元素,因此要定位元素,您必须诱导WebDriverWait,以便元素可单击,您可以使用以下解决方案:

  • 代码块:

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
    options = Options()
    options.add_argument('start-maximized')
    options.add_argument(' disable-extensions')
    driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
    driver.get('https://www.penfed.org/')
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.pfui-button.login-slide-button.pfui-button-login.dtm-global-nav[data-id='Open Log In Drawer']"))).click()
    
  • 浏览器快照:

penfed.org

您尝试单击的链接是针对移动站点的,如果您以桌面分辨率查看该站点,则该链接不可见。如果您缩小浏览器,直到它改变布局,您将看到登录按钮出现对应的链接。这就是为什么你得到ElementNotVisibleException。在

关于第二个问题,使用.execute_script()起作用的原因是它直接执行JS并且可以单击任何东西。。。不管隐藏与否。Selenium被设计成像用户一样与页面交互,所以它不会让你点击不可见的元素等等。 如果您想让您的脚本像用户一样工作,您应该避免使用.execute_script(),因为它允许您在页面上执行用户不能执行的操作。在

如果您想像桌面用户一样登录,您需要使用下面的CSS选择器单击“登录”按钮

button[data-id='Open Log In Drawer']

这将打开一个侧面板,您可以在其中输入用户名等,然后登录。仅供参考。。。在继续打开进程之前,您可能需要等待一个机会。在

您指定的代码是JQueryexecute_script(p1, p2)运行一个js脚本,其中p1是脚本(在您的例子中是单击元素的JQuery行),p2是所需的元素。如果arguments[0]等于“element”,似乎不需要p2,但我不完全确定。在

一个潜在的修复方法是使用计数器来计算您单击元素的次数。如果计数器达到某个数字并且页面没有改变(您可以通过在当前页面上找到一个唯一的元素/值来进行检查),那么您就知道它是不可单击的。在

祝你好运!在

相关问题 更多 >