Selenium在ipython和文件之间的行为不同

时间:2018-04-13 18:55:16

标签: python python-3.x selenium selenium-webdriver

我试图刮掉纽约州directory of trial judges。该站点检查是否启用了javascript并在页面上显示有关需要python的简短警告。所以我一直在尝试Selenium。

但是,当我在ipython或python中逐行运行时,它可以正常访问页面。然后,如果我从命令行(python scraper.py)运行此操作,该站点将使用javascript警告进行渲染 - 但仅在我第一次访问该站点时。发生这种情况:

  • 无论我使用什么浏览器,
  • 我是否将其作为无头浏览器运行,
  • 无论我尝试设置什么Cookie

我的代码:

import string
import csv
from selenium import webdriver

# Start the browser
browser = webdriver.Firefox()
browser.get(
    "https://iapps.courts.state.ny.us/judicialdirectory/JudicialDirectory")
print(browser.title)

# You can run the above 4 lines directly in ipython,
# but if running from the command line, the previous try will not work
browser.get(
    "https://iapps.courts.state.ny.us/judicialdirectory/JudicialDirectory")
print(browser.title)

如果是导入的话:我在Windows 10上运行它。

有没有人对如何调试这个有什么建议?

3 个答案:

答案 0 :(得分:2)

这里的区别在于,当作为脚本运行时,在JS实际有机会执行之前,正在访问browser.title。您可以通过在获取页面后等待来避免这种情况。使用time.sleep很简单

browser.get(...)
time.sleep(1.5)

但是,这可能会导致您等待的时间超过需要的时间。所以最好使用selenium的expected condition support。这样你就可以只在需要的时候等待。

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

condition = EC.presence_of_element_located((By.ID, "some_element_id_present_after_JS_load"))
driver.get(url)
WebDriverWait(driver, 10).until(condition)
print(driver.title)
# ... 

答案 1 :(得分:0)

我使用了Selenium的WebDriverWait函数来解决这个问题。

browser.get(
    "https://iapps.courts.state.ny.us/judicialdirectory/JudicialDirectory")
element = WebDriverWait(browser, 10).until(
             EC.presence_of_element_located((By.ID, "column1_A630"))) # a random element
print([i.text for i in element.find_elements_by_xpath("//a[contains(@href, 'JUDGE_ID')]")])
browser.quit()

答案 2 :(得分:0)

当你调用 url https://iapps.courts.state.ny.us/judicialdirectory/JudicialDirectory时, WebClient FirefoxBrowser 达到 document.readyState 在某个阶段等于 complete ,但这并不意味着所有关联的 Javascript Ajax Calls 已经完成。

现在,如果您查看包含页面标题 HTML 中的<head>标记,该标记会在某个 Javascript 之后呈现完成如下:

<script type="text/javascript" id="ucs-jd-internet-page-BioPage-0">
/*<![CDATA[*/

    function clearDefaultandCSS(el) {
      if (el.defaultValue == el.value)
    el.value = "";
    }

/*]]>*/
</script>
<title>Judicial Directory</title>

因此,直到相关的 Javascript 完成渲染,页面标题才会呈现。因此,您无法检索实际的页面标题

在这些情况下,最好的方法是将WebDriverWaitexpected_conditions子句同时设置为title_contains,如下所示:

browser.get("https://iapps.courts.state.ny.us/judicialdirectory/JudicialDirectory")
element = WebDriverWait(browser, 10).until(EC.title_contains(("Judicial Directory")))
print(browser.title)
browser.quit()