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

5
所以我一直在尝试使用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自动填写这张图片中的表单。

Pic1

这并没有任何的复杂性。但是每当我按“Skapa Konto”时,它就会加载并等待直到出现一个新页面,即:

Pic2

上面是哪张图片。我的想法是,我希望它等待直到给我那个“图片”(这是相同的链接,所以不会有任何更改),因此我认为最好的方法是等待浏览器中出现文本“FORTSÄTT或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”按钮时,它只是等待服务器进行双重检查,然后自动刷新页面并显示成功。

你能否在 WebDriverWait 后面移除 .wait 并尝试运行?根据官方文档,代码应该是 element = WebDriverWait(ff, 10).until(EC.presence_of_element_located((By.ID, "myDynamicElement")))。 - Satish
@CDNthe2nd 看起来你遇到了一个脆弱的绝对_xpath_。请更新问题并附上相关的_HTML。 - undetected Selenium
@Satish,没有起作用 - 我会在几分钟内更新我的问题,供你们两个参考! - CDNthe2nd
完成了!@DebanjanB!我希望我做得正确或符合你的意思! - CDNthe2nd
1个回答

8

首先,我强烈认为你已经很接近正确答案了。你只需要按照 Pythonic 的格式对你的代码进行格式化,就可以直接解决问题,具体如下:

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

您提到了“它不等待直接执行其他操作,这不应该发生”,却没有说明您的程序应该做什么(例如:代码试验),以及您的程序出了什么问题(即错误堆栈跟踪)。这样一来,您只是掩盖了实际问题。
根据您分享的HTML,您可以按以下方式为任一WebElements引入一个等待程序:
  • Waiter for the visibility of the text NU ÄR DU MEDLEM, Hello. :

    • 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.')]")))
      
  • Waiter for the button with text 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')]")))
      

哦,这样就行了!是的,那真的有帮助!现在它做到了我想要的。我真的很感激,我无法用言语来表达我的感谢之情! - CDNthe2nd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接