【问题标题】:Selenium cannot find element in main windowSelenium 在主窗口中找不到元素
【发布时间】:2017-12-18 07:00:30
【问题描述】:

我正在尝试使用 Selenium 和 Python 3 从网站下载文件。这需要按下覆盖窗口上的确认按钮。覆盖窗口不在 iFrame 中 - HTML 只是在覆盖出现时动态添加 - 但 Selenium 无法通过 xPath 找到按钮,返回 NoSuchElementException。我是否遗漏了任何会导致 Selenium 无法看到页面源中显示的元素的内容?据我所知,Selenium 应该能够毫无问题地找到按钮。

#Initialize Driver
driver = webdriver.Safari()

cmd = "osascript -e 'tell application \"Safari\" to set bounds of front window to {0, 22, 1500, 1022}'"
os.system(cmd)

#Call up seach link
driver.get(data_url)

wait_a = WebDriverWait(driver, 15)
element = wait_a.until(EC.presence_of_element_located((By.ID, "md-input-3")))

#Initialize and send login information (defined above)
username = driver.find_element_by_id("md-input-3")
password = driver.find_element_by_id("md-input-6")

username.send_keys(crunchbase_username)
password.send_keys(crunchbase_password)

#Click login button
password.send_keys(Keys.ENTER)

#Wait for results page to finish loading
wait = WebDriverWait(driver, 15)
element = wait.until(EC.title_contains("Signals"))

time.sleep(2)

#Press Download Button
driver.find_element_by_xpath("//button[@aria-label='Export your results']").click()
time.sleep(2)

#Press csv button
driver.find_element_by_xpath("//button[@aria-label='Export to CSV']").click()
time.sleep(2)

#Confirm downlaod
driver.find_element_by_xpath("//*[@id='cdk-overlay-36']/md-dialog-container/confirmation-dialog/dialog-layout/div/md-dialog-actions/div/button[2]").click()

#Close driver
#driver.close()

页面源代码过于复杂且高度风格化,因此我不会在此处包含它,但下面是我浏览器的网络检查器中代码相关部分的屏幕截图。我尝试点击的元素以蓝色突出显示。

Web Inspector Screenshot

感谢您对此提供的任何帮助。

【问题讨论】:

  • 这是一个您可以分享的公开网址吗?上面的哪一行是有问题的?确认下载?这是您要查找的屏幕截图中突出显示的元素吗?
  • 你还没有提到哪个confirmation button过于复杂和高度程式化 HTML 在粘贴为Formatted textimage 时有何不同

标签: javascript python html selenium web-scraping


【解决方案1】:

如果无法访问相关页面并且无法查看发生了什么,则很难判断。一般几点:

  1. 尝试使用 css 选择器而不是 xpath。它们更强大、更易于使用且速度更快。
  2. 避免使用动态生成的 ID。在您的屏幕截图中,我什至看不到代码中出现的 id。
  3. 如果您有多个相同类型的元素(如您的情况下的按钮),请尝试获取某个父级下的所有 web 元素并测试所有这些元素是否具有您正在寻找的属性值。

例如:

elemItems = driver.find_elements_by_css_selector(menuItemSelector)

for element in elements:
    if element.text == "export":
        elemItems[1].click()

在这里,您可以找到某种类型的所有元素(例如按钮)并选择其中包含“导出”文本的元素。

【讨论】:

    【解决方案2】:

    在点击元素之前,执行以下几行:

        WebElement element = driver.findElement(By.xpath(" path_of_your_module "));
    ((JavaScriptExecutor) driver). executeScript("argument[0].scrollIntoView(true);", element);
    

    【讨论】:

      猜你喜欢
      • 2013-01-16
      • 2016-03-24
      • 1970-01-01
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多