【问题标题】:Python selenium cannot find element even with wait即使等待,Python selenium 也找不到元素
【发布时间】:2020-01-24 05:16:54
【问题描述】:

我正在尝试将文本发送到输入字段,但 selenium 无法找到该元素。

element = WebDriverWait(b, 10).until(EC.presence_of_element_located((By.XPATH, '/html/body/table/tbody/tr[1]/td/form/div/table/tbody/tr[2]/td/table[2]/tbody/tr/td[4]/table/tbody/tr/td[1]/input')))
element.send_keys("Customer Care", Keys.ENTER)

我尝试使用 XPATH、完整的 XPATH 和 ID 来定位它,但它一直给我一个错误,表明它找不到元素 selenium.common.exceptions.TimeoutException

HTML 元素的 sn-p

<input class="iceInpTxt testBox" id="headerForm:jumpto" maxlength="40" name="headerForm:jumpto" onblur="setFocus('');iceSubmitPartial(form, this, event);" onfocus="setFocus(this.id);" onkeyup="iceSubmit(form,this,event);" onmousedown="this.focus();" type="text" value="">

【问题讨论】:

标签: python html selenium


【解决方案1】:

元素有ID,将其用作定位器。检查元素是否在 iframe 内:

wait = WebDriverWait(b, 10)
element = wait.until(EC.element_to_be_clickable((By.ID, 'headerForm:jumpto')))
element.send_keys("Customer Care", Keys.ENTER)

如何切换到 iframe:

wait = WebDriverWait(b, 10)

wait.until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, "iframe_locator")))

element = wait.until(EC.element_to_be_clickable((By.ID, 'headerForm:jumpto')))
element.send_keys("Customer Care", Keys.ENTER)

# How to go back to default content
b.switch_to.default_content()

【讨论】:

  • 它在 iframe 中。我该怎么办?
  • 在答案中使用代码如何切换到 iframe。分享 iframe 的 html
【解决方案2】:

检查您是否安装并导入了 selenium 或其他必要的软件包是个好主意。使用pip检查你的版本,看看是否有在线bug。请让我知道您使用的是什么 python 版本。您提供的XPATH 可能不正确,或者尝试增加WebDriverWait(1st,2nd) 的第二个参数中的时间量。如果您有指向此 html 页面的链接会更有帮助,以便我可以查看您的XPATH。如果您需要进一步的帮助,请提供您的 html 页面。

编辑: 这是需要复制的东西,以便可以检查。如果您已尝试上述方法,除非我看到 html 文档,否则我无法提供帮助。您应该在共享之前删除所有敏感信息。您的代码的其他元素似乎是正确的。

【讨论】:

  • 我使用的是 Python 版本 Python 3.7.6。我无法提供 HTML 页面,因为这需要我向您提供我的登录凭据。
  • @SisqoBaker,此时我建议您测试XPATH 中的每个元素。使用 EC.presence_of_element_located((By.XPATH, thePath) ,首先测试 html 是否存在(检查它的格式是否正确,我不知道你是如何访问你的 html 的)。然后你做body/table等,直到你到达它停止工作的地方。
  • @SisqoBaker 我认为提供 HTML 和粗略地提供基于文本的相关 HTML 没有任何害处,您无论如何都不需要提供您的凭据。如果没有 HTML,您将不会得到任何规范的答案,贡献者也无法测试他们想要建议您的定位器。因此,提供 HTML 对双方来说都是双赢的局面。
【解决方案3】:

如果您的用例涉及在调用 WebDriverWait 而不是 presence_of_element_located() 时调用 click()send_keys(),您需要将 expected_conditions 用作 element_to_be_clickable(),如下所示:

如此有效,您可以使用以下任一Locator Strategies

  • 使用CSS_SELECTOR

    WebDriverWait(b, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.iceInpTxt.testBox[id^='headerForm'][name$='jumpto']"))).send_keys("Customer Care", Keys.ENTER)
    
  • 使用XPATH

    WebDriverWait(b, 10).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='iceInpTxt testBox' and @id='headerForm:jumpto'][@name='headerForm:jumpto']"))).send_keys("Customer Care", Keys.ENTER)
    

参考文献

您可以在以下位置找到一些关于不同预期条件的详细讨论:

【讨论】:

  • @SisqoBaker 查看更新后的答案并告诉我状态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 2012-04-07
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多