如何使用Selenium在网页中查找元素的位置?

时间:2018-01-31 13:48:39

标签: python python-3.x selenium

我试图通过ID在网页上使用Selenium找到元素的位置。但问题是,当我运行python代码时,我得到了元素的错误位置。 下面的图片说明了我面临的问题。在图片中,黄色圆圈显示ID为“ca-talk”的元素,红色圆圈显示运行脚本后得到的位置。 enter image description here

代码如下:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException
from datetime import datetime
import pyautogui
import os
from collections import OrderedDict
import urllib.request
from pathlib import Path
from requests import get
import time

minimumWindow = False

def internet_on():
    i = 0
    while True:
        try:
            urllib.request.urlopen('http://www.google.com', timeout=20)
            return True
        except:
            print("Internet not found for last %s minuts" % i)
            i = i + 1
            time.sleep(60)
            pass

browser = webdriver.Chrome()
browser.maximize_window()
if minimumWindow:
    pyautogui.moveTo(600, 3, 1)
    pyautogui.dragTo(0, 200, 1, button='left')

browser.get('https://en.wikipedia.org/wiki/Main_Page')

e = browser.find_element_by_id('ca-talk')
location = e.location
size = e.size
print(location)
print(size)
pyautogui.moveTo(location['x'], location['y'], 0.1)

(x, y) = pyautogui.position()

print(str(x) + " " + str(y) + "\n")

输出如下:

{'x': 254, 'y': 40}
{'height': 40, 'width': 38}
254 40

而实际位置在x = 335和y = 205附近。

知道为什么会发生这种情况。 谢谢

1 个答案:

答案 0 :(得分:0)

经过多次反复试验,我找到了解决方案。

pyautogui.moveTo(location['x'], location['y'], 0.1)

所有需要做的就是将这一行替换为

a = browser.execute_script("return outerWidth")
c = browser.execute_script("return outerHeight - innerHeight")
b = browser.execute_script("return outerHeight")
pyautogui.moveTo(location['x']*1920/a, (location['y'] + c)*1080/b, 0.1)

这里1920和1080是我的屏幕分辨率。

我发现由于某种原因,outerWidth和outerHeight的值返回分别不等于1920和1080,因此比率1980 / a和1080 / b给出了乘以因子来获得原始像素。而c则照顾空间浪费在网址栏和其他不属于网页的内容中。这里的x和y位置是相对于网页而非屏幕的位置。

如果有人知道为什么outerWidth和outerHeight不等于1980或1080,那么我想阅读。 谢谢。