Python + Selenium:等到元素完全加载

Python + Selenium: Wait until element is fully loaded

所以我一直在尝试使用 Selenium 中的函数:

wait = WebDriverWait(browser, 20).wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="accountStandalone"]/div/div/div[2]/div/div/div[1]/button')))
wait.click()

在我开始说这个问题之前。我想要做的 Selenium 基本上是制作一个自动写入这张图片中的论坛的 Selenium:

这不是任何并发症。但是,每当我按 "Skapa Konto" 时,它都会加载并等待,直到出现一个新页面:

也就是上图。我的想法是,我希望它应该等到它给我 "picture"(这是相同的 link,所以它不会进行任何更改)所以我认为最好的做法是等待直到文本等 "FORTSÄTT or HELLO" 是浏览器。然后继续。

但是,我在尝试使用它时遇到了问题。原因是它不会等到找到,而是立即执行并执行其他不应该执行的操作。现在它只是跳过等待,就像该功能不起作用或根本不存在一样。我做错了什么?


更新:

我所知道的是,每当我尝试在该网站上注册时 - 网站不会改变,这意味着它会在成功注册后将我带到一个新页面。但它会自动刷新并说它成功了。所以这意味着我想以某种方式制作一些东西来检查页面是否发生了新的事情。如果不行,再等等再试?...类似这样的?

我会做的是等检查是否有:

<div class="confirmation-title nsg-font-family--platform nsg-text--black edf-title-font-size--xlarge js-confirmationTitle">NU ÄR DU MEDLEM, Hello.</div>

<button type="button" class="nsg-button nsg-bg--black register-next-step-cta js-nextStepCta">FORTSÄTT</button>

然而问题正如我所说,每当我按下 "SKAPA KONTO" - 它只是等待服务器仔细检查,然后自动刷新页面并说成功。

首先,我坚信你非常接近。您只需要在 Pythonic 中格式化您的代码,这可能会立即解决您的问题,如下所示:

WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="accountStandalone"]/div/div/div[2]/div/div/div[1]/button'))).click()

您通过提及它不会等到发现而是立即执行其他不应该做的事情而不是提及什么,从而掩盖了实际问题你的程序应该做的(例如你的代码试验)以及你的程序做错了什么(即错误堆栈跟踪)。

根据您共享的 HTMLs,您可以为 WebElements 中的任何一个引入服务员,如下所示:

  • 等待文字可见度NU ÄR DU MEDLEM,您好 :

    • CSS_SELECTOR :

      WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.confirmation-title.nsg-font-family--platform.nsg-text--black.edf-title-font-size--xlarge.js-confirmationTitle")))
      
    • XPATH :

      WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='confirmation-title nsg-font-family--platform nsg-text--black edf-title-font-size--xlarge js-confirmationTitle' and contains(.,'NU ÄR DU MEDLEM, Hello.')]")))
      
  • 等待带有文本的按钮 FORTSÄTT :

    • CSS_SELECTOR :

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.nsg-button.nsg-bg--black.register-next-step-cta.js-nextStepCta")))
      
    • XPATH :

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@class='nsg-button nsg-bg--black register-next-step-cta js-nextStepCta' and contains(.,'FORTSÄTT')]")))