使用Selenium和Python3无法在表单中找到元素

时间:2019-03-01 03:10:01

标签: python-3.x selenium xpath iframe css-selectors

我无法在https://www.hmm21.com/cms/business/hongkong/export/vgmWithoutLogin/index.jsp

的“预订号”文本框中输入文本。

这是在chrome上使用inspect的文本框的html:

<input style="width:200px;text-transform:uppercase;ime-mode:disabled;" type="text" maxlength="12" name="bookingNumber" value="">

这是我现在使用的代码:

element = WebDriverWait(self.driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@name='bookingNumber']"))).send_keys('test')

我也尝试了许多其他方法,例如使用CSS Selector,绝对xpath进行选择,但我似乎无法在文本框中输入任何内容。

我还使用ChroPath,其他一些chrome扩展程序以及Firefox上的xPath Finder测试了xpath和CSS选择器,它们似乎都可以正常工作。

如果有人可以帮助,将不胜感激。谢谢。

4 个答案:

答案 0 :(得分:0)

在发送键之前尝试单击该元素,您也可以执行JavaScript来修改其值。

.click()

如果输入是通过JavaScript显示的,请等待该元素出现并且不可单击。

.presence_of_element_located()

答案 1 :(得分:0)

您应该先切换iframe,然后使用

WebDriverWait(self.driver, 10).until(EC.frame_to_be_available_and_switch_to_it(self.driver.find_element_by_id('_frame1')))

因为预订号文本框输入元素位于名为'_frame1'的新iframe中。

希望它会对您有所帮助。

答案 2 :(得分:0)

要将字符序列发送到与文本 Booking Number 相关的元素,因为所需元素位于<iframe>中,因此您必须:

  • 诱导 WebDriverWait 以使所需的框架可用并切换到它。
  • 诱导 WebDriverWait 以使所需的元素可点击
  • 您可以使用以下解决方案:

    • 使用CSS_SELECTOR

      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe#_frame1[src='/ebiz/ebooking/vgm/indexWithoutlogin.jsp']")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[name='bookingNumber']"))).send_keys('Rong Heng')
      
    • 使用XPATH

      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@id='_frame1' and @src='/ebiz/ebooking/vgm/indexWithoutlogin.jsp']")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@name='bookingNumber']"))).send_keys('Rong Heng')
      
  

在这里您可以找到有关Ways to deal with #document under iframe的相关讨论

答案 3 :(得分:0)

该元素位于ChroPath建议的iframe中。因此,首先您必须切换到iframe并执行操作。有时候,如果sendKeys在输入框上不起作用,请在发送输入框中的键之前尝试使用clear / click()方法。

enter image description here