【问题标题】:Selenium (Python) clicking an element within a frameSelenium (Python) 单击框架内的元素
【发布时间】:2018-01-11 21:14:39
【问题描述】:

我在领英中遇到问题。单击“连接”按钮后,会出现一个如下所示的框架:

我正在尝试单击“立即发送”按钮,但显示它不可见。我试图通过每个已知的 id/class 切换帧。该错误表示无法满足交换帧,因为找不到该帧。有人知道我在做什么错吗?

  <div id="li-modal-container"><div id="ember1954" class="modal-wormhole visible send-invite ember-view"><div aria-labelledby="ember1483-modal-label" role="dialog" tabindex="-1" class="modal-wormhole-content">
  <div class="modal-content-wrapper">
            <section class="modal">
    <div role="document">
      <header class="send-invite__header">
        <h2 id="ember1483-modal-description" class="Sans-21px-black-85% pv3">
            You can customize this invitation
                  </h2>
          <button type="button" name="cancel" class="send-invite__cancel-btn" data-ember-action="" data-ember-action-1955="1955">
            <span class="svg-icon-wrap"><span class="visually-hidden">Close</span><li-icon aria-hidden="true" type="cancel-icon"><svg viewBox="0 0 24 24" width="24px" height="24px" x="0" y="0" preserveAspectRatio="xMinYMin meet" class="artdeco-icon"><g class="large-icon" style="fill: currentColor">
        <path d="M20,5.32L13.32,12,20,18.68,18.66,20,12,13.33,5.34,20,4,18.68,10.68,12,4,5.32,5.32,4,12,10.69,18.68,4Z"></path>
      </g></svg></li-icon></span>
          </button>
      </header>

      <div class="ph4">
<!----><!---->
          <p id="ember1483-modal-label" class="pv4 mb3 display-flex">
              LinkedIn members are more likely to accept invitations that include a personal note.
                      </p>
<!---->      </div>

      <div class="send-invite__actions">
          <button class="button-secondary-large mr1" data-ember-action="" data-ember-action-1956="1956">
            Add a note
          </button>
          <button class="button-primary-large ml1" data-ember-action="" data-ember-action-1957="1957">
              Send now
                      </button>
      </div>
    </div>
  </section>

我试过了:

WebDriverWait(driver, 15).until(EC.visibility_of_element_located(By.XPATH("//butto‌​n[@class='button-pri‌​mary-large ml1']"))) 

并得到这个错误: TypeError: 'str' 对象不可调用

【问题讨论】:

  • 那不是框架,那只是一个 div。
  • 您是否在等待按钮显示后才尝试单击它?
  • 我尝试了几种不同的 WebDriverWaits...他们说“'str' object is not callable”
  • 那是你的问题。您需要等待元素可见,然后才能单击它。您需要显示您正在使用的代码和确切的错误消息。
  • edit您的问题添加附加信息。评论区的 Python 代码看不懂。

标签: python selenium linkedin frame


【解决方案1】:

至少部分问题是您没有正确等待元素可见,然后再尝试单击它。

您尝试使用的代码不正确。您的问题显示此代码:

WebDriverWait(driver,15).until(
    EC.visibility_of_element_located(
        By.XPATH("//butto‌​n[@class='button-pri‌​mary-large ml1']"))) 

By.XPATH 不是一个函数,它是一个字符串常量。当您执行By.XPATH("...") 时,您正在尝试调用By.XPATH,就好像它是一个函数一样。这就是您收到错误TypeError: 'str' object is not callable 的原因。

visibility_of_element_located 的参数需要是一个元组,其中第一个值是 By.XPATH,第二个值是 xpath。

例如:

WebDriverWait(driver,15).until(
    EC.visibility_of_element_located(
        (By.XPATH, "//butto‌​n[@class='button-pri‌​mary-large ml1']"))) 

如果元素是动态创建的,您可能需要先等待元素存在,然后才能等待元素可见。您可以使用EC.presence_of_element_located 做到这一点。

【讨论】:

  • 出现错误。消息:通过 XPath 搜索元素时发生错误。
  • @ChrisBrocious 如果这是完整、准确的错误消息,我无能为力。最重要的是,您需要等待元素才能单击它。这对硒来说非常重要。
  • 在您尝试等待它时,该元素很可能不存在。您可能需要先等待presense_of_element_located,然后才能看到它。
  • 它就是这么说的。我之前在 LinkedIn 上使用 WebDriverWaits 遇到过这个问题......我看到驱动程序没有等待元素加载。我只是将它超时(time.sleep())并绕过它。如果您在 LinkedIn 中简单地搜索二级连接,您可能会更好地了解我在与什么作斗争。我想在“连接”点击后它是一个弹出的新框架......我是新的......所以
【解决方案2】:
def connect_me():
sendNow = driver.find_element_by_css_selector(".button-primary-large.ml1")
driver.execute_script("arguments[0].style.visibility = 'visible'; arguments[0].click();", sendNow)
time.sleep(4)
return

这就是我能够点击它的方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多