如果使用 Selenium 和 Python 在浏览器中不“眼睛可见”,则无法获取“WebDriver”元素数据

Can't get "WebDriver" element data if not "eye-visible" in browser using Selenium and Python

提问人:Piero Costa 提问时间:9/21/2018 最后编辑:Piero Costa 更新时间:9/24/2018 访问量:288

问:

我正在 Python 中使用 Selenium 进行抓取。我的问题是,在我找到所有 WebElements 后,如果元素在使用 Selenium 打开的浏览器中并不真正可见,我将无法获得它们的信息(id、文本等)。

我的意思是:

第一张图片

第二张图片

从第一张和第二张图片中可以看出,我有前 4 个“表”,它们对我和代码都是“可见的”。然而,还有另外2张桌子(5和6 Gettho lucky dip & Sue Specs)在我向下拖动右栏之前是“可见的”。

这是我尝试获取元素信息时得到的,而无需在页面中“看到它”:

第三张图片

手动将页面拖动到底部,从而使其对人眼(以及代码???)“可见”是我可以从我需要的 WebDriver 元素中获取数据的唯一方法:

第四张图片

我错过了什么?为什么 Selenium 不能在后台做到这一点?有没有办法在不上下翻页的情况下解决这个问题?

PS:该页面可以是 http://greyhoundbet.racingpost.com/ 中的任何类型的赛狗页面。只需单击“城市”-“时间”-然后单击“表单”。


这是我的部分代码:

# I call this function with the URL and it returns the driver object
def open_main_page(url):
chrome_path = r"c:\chromedriver.exe"
driver = webdriver.Chrome(chrome_path)
driver.get(url)

# Wait for page to load
loading(driver, "//*[@id='showLandingLADB']/h4/p", 0)
element = driver.find_element_by_xpath("//*[@id='showLandingLADB']/h4/p")
element.click()

# Wait for second element to load, after click
loading(driver, "//*[@id='landingLADBStart']", 0)
element = driver.find_element_by_xpath("//*[@id='landingLADBStart']")
element.click()

# Wait for main page to load.
loading(driver, "//*[@id='whRadio']", 0)
return driver

现在我有了浏览器“驱动程序”,我可以用它来查找我想要的元素

url = "http://greyhoundbet.racingpost.com/#card/race_id=1640848&r_date=2018- 
09-21&tab=form"
browser = open_main_page(url)

# Find dog names
names = []
text: str
tags = browser.find_elements_by_xpath("//strong")

现在,“TAGS”是 WebDriver 元素的列表,如图所示。

我是这个领域的新手。


更新: 我已经用代码解决方法解决了这个问题。

tags = driver.find_elements_by_tag_name("strong")

for tag in tags:
    driver.execute_script("arguments[0].scrollIntoView();", tag)
    print(tag.text)

以这种方式,浏览器将移动到元素位置,并且它将能够获取其信息。

但是,我仍然不知道为什么特别是对于此页面,我无法阅读在浏览器区域中不可见的网页元素,直到我滚动并真正看到它们。

python selenium 网页抓取 webdriver chrome-web-driver

评论

0赞 undetected Selenium 9/21/2018
一旦你调用了 url whar,你要自动化手动步骤是什么?你能确认确切的网址吗?
0赞 Piero Costa 9/21/2018
例如,greyhoundbet.racingpost.com/#card/...。我正在尝试获取 TAG 中的所有文本<strong> TEXT </strong> 但是,如果文本不在屏幕上,我将无法获得元素信息(即使我已经在列表中有该元素)

答: 暂无答案