Как извлечь текст из элемента «Здоровье» - PullRequest
0 голосов
/ 16 ноября 2018

Я часами пытался найти правильную ссылку для использования в селене для значения HP этой игры.

Чтобы проверить себя, я предоставлю пользователя и пароль, как указано ниже:

Веб-сайт: https://s3 -en.bitefight.gameforge.com / user / login

Имя пользователя: testaccount111

Пароль: python123

enter image description here

Я пробовал health = driver.find_elements_by_xpath("//div[2]/div/div[1]/text()[5]"), но выдает ошибки.

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

@ NarendraR имеет хороший ответ, в python код для получения результата: 21500 равен

health = driver.execute_script('''
  var value = document.evaluate("//img[@alt='Health']/preceding-sibling::text()[1]",document, null, XPathResult.STRING_TYPE, null );
  return value.stringValue.split('/')[0].trim().replace('.', '');
''');

и для другого метода

elem = driver.find_element_by_xpath('//div[@class="gold"]')
health = re.search(r'(\d+\.\d+)\s+/', elem.text).group(1)
health = int(health.replace('.', ''))
0 голосов
/ 16 ноября 2018

Согласно веб-сайту https://s3-en.bitefight.gameforge.com/user/login для извлечения текста из элемента Health , т.е. 8.460 / 21.500 , вам нужно вызвать WebDriverWait для желаемого элемент должен быть видимым , и вы можете использовать следующее решение:

  • Блок кода:

    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
    
    options = webdriver.ChromeOptions() 
    options.add_argument("start-maximized")
    options.add_argument('disable-infobars')
    driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    driver.get("https://s3-en.bitefight.gameforge.com/user/login")
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='input' and @name='user']"))).send_keys("testaccount111")
    driver.find_element_by_xpath("//input[@class='input' and @name='pass']").send_keys("python123")
    driver.find_element_by_xpath("//input[@class='btn-small' and @value='Login']").click()
    WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[@class='gold']//img[contains(@src,'/img/symbols')]")))
    health_text = driver.find_element_by_xpath("//div[@class='gold']").get_attribute("textContent").splitlines()[5]
    print(health_text)
    
  • Вывод на консоль:

          8.460 / 21.500
    
0 голосов
/ 16 ноября 2018

используйте ниже xpath, чтобы найти элемент (отмечен на картинке)

//img[@alt='Health']/preceding-sibling::text()[1]

, но селен не позволяет вам найти элемент с помощью текстового узла. Альтернативный способ - вы можете использовать javascript executor для оценки xpath.

У меня ниже ссылка на код в Java. пожалуйста, измените согласно питону

JavascriptExecutor js = (JavascriptExecutor)driver;
Object health= js.executeScript("var value = document.evaluate(\"//img[@alt='Health']/preceding-sibling::text()[1]\",document, null, XPathResult.STRING_TYPE, null ); return value.stringValue;"); 
System.out.println(health.toString().trim());

OR

WebElement element = driver.findElement(By.xpath("//div[@class='gold']"));
JavascriptExecutor js = (JavascriptExecutor)driver;
String health= (String) js.executeScript("return arguments[0].childNodes[8].textContent", element);
System.out.println(health.trim());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...