Selenium python - 通过数据值查找元素

lev*_*von 3 python selenium

这个元素是一个多选区域选择器,但我不知道如何与其交互。

HTML 元素

<div class="Input_select__uImQR Region_select__1h_yh"><span>NA</span><ul><li 
data-value="na">NA</li><li data-value="sa">SA</li><li data-value="eu">EU</li><li data- 
value="ap">AP</li><li data-value="kr">KR</li></ul></div>
Run Code Online (Sandbox Code Playgroud)

当您手动单击列表时,类名称将更改为

<div class="Input_select__uImQR Region_select__1h_yh Input_open__3e__v">
Run Code Online (Sandbox Code Playgroud)

代码

driver.get("https://www.valorant.store/")
  time.sleep(1)
  clickshop = driver.find_element_by_class_name("SkinsBundle_loggedOut__3kG35").click()
  time.sleep(2)
  usernameshop = driver.find_element_by_name("username")
  usernameshop.send_keys(name)
  passwordshop = driver.find_element_by_name("password")
  passwordshop.send_keys("notmypassword")
  driver.find_element_by_xpath("//option[@value='eu']").click()
  time.sleep(10)
  usernameshop.send_keys(Keys.RETURN)
Run Code Online (Sandbox Code Playgroud)

以下是全部代码(该账号用于测试,您可以随意使用)

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
from selenium.webdriver.common.keys import Keys
import time

from selenium.webdriver.common.action_chains import ActionChains
import sys, os

driver = webdriver.Firefox()
skinfound  = bool(False)
while skinfound == False:

  driver.maximize_window()
  driver.get("https://www.valorant.store/")
  time.sleep(1)
  clickshop =driver.find_element_by_class_name("SkinsBundle_loggedOut__3kG35").click()
  time.sleep(2)
  usernameshop = driver.find_element_by_name("username")
  usernameshop.send_keys("sy9e0w6uimpc6fek")
  passwordshop = driver.find_element_by_name("password")
  passwordshop.send_keys("2ejly4ocpwifjbhj")
  driver.find_element_by_xpath("//li[@data-value='eu']").click()

  time.sleep(10)
  usernameshop.send_keys(Keys.RETURN)
  time.sleep(10)
  WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH,"//img[@src='/images/bonuscard.png' and @alt='Card Icon']"))).click()
  time.sleep(2)
  skins = driver.find_element_by_class_name("NightMarket_itemsGrid__9e2S-").text
  print(skins)
  if "Prime" in skins:
    print("A Prime skin was found")
    skinfound = True
  else:
    print("skinwasnotfound")
Run Code Online (Sandbox Code Playgroud)

cru*_*dey 5

我没有看到这个 xpath

//option[@value='eu']
Run Code Online (Sandbox Code Playgroud)

在共享的HTML中。

如果这是 HTML

<li data-value="eu">EU</li>
Run Code Online (Sandbox Code Playgroud)

你可以将 xpath 写为:

//li[@data-value='eu']
Run Code Online (Sandbox Code Playgroud)

或者

//li[text()='EU']
Run Code Online (Sandbox Code Playgroud)

在代码中,您可以像这样使用它:

driver.find_element_by_xpath("//li[@data-value='eu']").click()
Run Code Online (Sandbox Code Playgroud)

或者

wait = WebDriverWait(driver, 20)
wait.until(EC.element_to_be_clickable((By.XPATH, "//li[text()='EU']"))).click()
Run Code Online (Sandbox Code Playgroud)

进口:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
Run Code Online (Sandbox Code Playgroud)

更新1:

driver = webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(30)
driver.get("https://www.valorant.store/")
wait = WebDriverWait(driver, 20)
wait.until(EC.element_to_be_clickable((By.XPATH, "//span[text()='LOGIN']/.."))).click()
wait.until(EC.visibility_of_element_located((By.NAME, "username"))).send_keys('user name here')
wait.until(EC.visibility_of_element_located((By.NAME, "password"))).send_keys('password here')
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div[class^='Input_select'] span"))).click()
time.sleep(2)
wait.until(EC.visibility_of_element_located((By.XPATH, "//li[@data-value='eu']"))).click()
Run Code Online (Sandbox Code Playgroud)

这应该对你有用。

如果您需要处理登录前某个时间出现的弹出窗口,您可以使用以下代码:

driver = webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(30)
driver.get("https://www.valorant.store/")
wait = WebDriverWait(driver, 20)

try:
    if(len(driver.find_elements(By.XPATH, "(//i[@class='fas fa-times']/..)[2]"))) > 0:
      print("Alert is present")
      wait.until(EC.element_to_be_clickable((By.XPATH, "(//i[@class='fas fa-times']/..)[2]"))).click()
    else:
        print("Alert is not present")
except:
    print("Something went wrong related to alert, may be it was not visible, but code will work")
    pass


wait.until(EC.element_to_be_clickable((By.XPATH, "//span[text()='LOGIN']/.."))).click()
wait.until(EC.visibility_of_element_located((By.NAME, "username"))).send_keys('user name here')
wait.until(EC.visibility_of_element_located((By.NAME, "password"))).send_keys('password here')
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div[class^='Input_select'] span"))).click()
time.sleep(2)
wait.until(EC.visibility_of_element_located((By.XPATH, "//li[@data-value='eu']"))).click()
Run Code Online (Sandbox Code Playgroud)