如何从浏览器测试中检索 Ping 下载和上传时间?

How to retrieve the Ping Download and Upload time from browser tests?

我正在尝试使用不同的浏览器自动实现 speedtests 自动化,测试的主要部分在一个循环中。问题是,有时,一个元素之前已经 selected,并且脚本在接下来的步骤之一中正确运行,完全在同一循环和同一页面,但编号不同,没有xpath 中的任何更改,selenium 都无法再次 select 它。所以,我不能随心所欲地重复我的测试。

大多数时候我在使用 Edge 时遇到这个问题,我认为原因之一可能是我在 Chrome 或 Firefox 的帮助下找到的元素的 xpath。 (我首先在 Edge 中找不到 xpath,我搜索了很多)。

我也放了我用的不同的xpath。其实我想获取ping、下载、上传位置和服务器的数值或字符串值。

请告诉我,我该如何解决这个问题,我尝试了不同的睡眠时间和两个不同的 xpath。当我尝试 select 带有 class_name 或 css_selector 的元素时,脚本总是给我错误。

火狐: "/html/body/div[3]/div[2]/div/div/div/div[3]/div[1]/div[3]/div/div[3]/div/div[1]/div[2]/div[1]/div/div[2]/span"

chrome: "//[@id='container']/div[2]/div/div/div/div[3]/div[1]/div[3]/div/div[3]/div/div[1]/div[2]/div[1]/div/div[2]/span"

chrome:

"//div[@class='result-item result-item-ping updated']/div[2]/span"

另一个问题是如何等待页面完全加载。这种方法 WebDriverWait(driver,some seconds) 对我不起作用,我必须使用 time.sleep()

错误: selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素

element = driver.find_element_by_xpath("/html/body/div[3]/div[2]/div/div/div/div[3]/div[1]/div[3]/div/div[3]/div/div[1]/div[2]/div[1]/div/div[2]/span")

使用以下 CSS 定位符来识别值:

下载:*.result-data-large.number.result-data-value.download-speed*

上传:*.result-data-large.number.result-data-value.upload-speed*

平:*.result-data-large.number.result-data-value.ping-speed*

利用getText(),您可以检索它们的值。等待页面中的某个元素可见,以确保页面加载成功。

试试:element = driver.find_element_by_xpath("/html/body/div[3]/div[2]/div/div/div/div[3]/div[1]/div[3]/div/div[3]/div/div[1]/div[2]/div[1]/div/div[2]/")

也许您还需要捕获异常:NoSuchElementException 个案例。

我已经测试了这些 CSS 选择器,它们在 Chrome 和 Edge 中都有效。

span.ping-speed                         # ping
span.download-speed                     # download
span.upload-speed                       # upload
div.server-current > div.result-label   # server

如果您想知道页面何时完成加载,可以等到 URL 从 https://www.speedtest.net 变为 https://www.speedtest.net/results/<some number>。我只会使用 WebDriverWaiturl_contains("results") ,例如

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC 
WebDriverWait(driver, 10).until(EC.url_contains("results"))

中还有一些其他方法。

要使速度测试自动化,您可以使用以下解决方案:

  • 代码块:

    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
    
    driver = webdriver.Edge(executable_path=r'C:\WebDrivers\MicrosoftWebDriver.exe')
    driver.get("https://www.speedtest.net/")
    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a.js-start-test.test-mode-multi"))).click()
    WebDriverWait(driver, 45).until(EC.url_contains("result"))
    print("Ping :"+driver.find_element_by_css_selector("div[title='Reaction Time'] div.result-data.u-align-left>span").get_attribute("innerHTML"))
    print("Download: "+driver.find_element_by_css_selector("div[title='Receiving Time'] div.result-data.u-align-left>span").get_attribute("innerHTML"))
    print("Upload :"+driver.find_element_by_css_selector("div[title='Sending Time'] div.result-data.u-align-left>span").get_attribute("innerHTML"))
    #driver.quit()
    
  • 控制台输出:

    Ping :35
    Download: 21.53
    Upload :3.46
    
  • 浏览器快照:

    WebDriverWait driverWait = new WebDriverWait(driver, 30000);
    driver.get("https://www.speedtest.net/");
    WebElement goLink = driver.findElement(By.cssSelector(".js-start-test.test-mode-multi"));
    driverWait.until(ExpectedConditions.elementToBeClickable(goLink));
    goLink.click();

    By download = By.cssSelector(".result-data-large.number.result-data-value.download-speed");
    By upload = By.cssSelector(".result-data-large.number.result-data-value.upload-speed");
    By ping = By.cssSelector(".result-data-large.number.result-data-value.ping-speed");

    driverWait.until(ExpectedConditions.urlMatches("https://www.speedtest.net/result/[0-9]"));
    String downloadSpeed = driver.findElement(download).getText();
    String uploadSpeed = driver.findElement(upload).getText();
    String pingValue = driver.findElement(ping).getText();
    System.out.println("Download: "+downloadSpeed + "\nUpload: "+ uploadSpeed + "\n Ping: "+pingValue);

输出 下载:78.82 上传:45.93 平安:23